1. 计算机程序的构造与解释
PPTX | 演示代码 | |
---|---|---|
1-dat | 1-dat | cons-explain |
调试器gdb
gdb中常见的指令
命令 | 效果 |
---|---|
开始和停止程序 | |
quit | 退出gdb |
run | 启动程序(如果有命令行参数的话, 在这里传入) |
kill | 停止程序 |
设置端点 | |
break mulstore | 在函数mulstore 入口处设置端点 |
break main.cpp:34 | 在main.cpp 的第 |
break *0x00406540 | 在地址0x00406540 设置端点 |
delete 1 | 删除第一个端点 |
delete | 删除所有断点 |
执行 | |
step | 执行一条指令(简写为s ) |
stepi 4 | 执行4条指令 |
nexti 4 | 类似stepi , 但是不陷入函数调用 |
continue | 继续程序的执行 |
finish | 继续执行, 直到当前函数返回 |
检查数据 | |
print x | (简写: p x ) 打印变量x的值 |
有用的信息 | |
info frame | 当前栈帧的信息 |
info breakpoints | 所有断点的信息 |
help | Get information about GDB |
开启反向调试
在GDB中开启反向调试可以通过以下步骤实现:
-
启动GDB: 首先在终端中启动GDB并加载你需要调试的程序。例如:
gdb ./your_program
-
设置断点: 在你想要开始调试的地方设置一个断点。例如:
break main
-
运行程序: 开始运行程序直到它命中断点。例如:
run
-
启用反向调试: 使用以下命令启用反向调试:
target record-full
-
进行反向调试: 一旦启用了反向调试,你可以使用以下命令来进行调试:
reverse-step
:逐步执行反向指令。reverse-next
:反向执行下一条指令,跳过函数调用。reverse-continue
:反向继续执行,直到到达一个断点或程序的开始。reverse-finish
:反向运行直到当前函数返回。
例如:
reverse-step
reverse-next
reverse-continue
reverse-finish
(有时候会出现问题, 如浮点数的时候)
防止在调试的时候陷入标准库
skip -gfile bits/*.h
阅读材料
- C语言中的递归(魏恒峰, NJU)
- 递归问题(蒋炎岩, NJU)
- 调试指南(sbwgg, NJU)
- (选读) 计算机程序的构造与解释: Python版(UCB录像, NJU录像(JacyCui)); Lisp版(录像);