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版(录像);