Debug
GDB(GNU Debugger)是GCC的调试工具。其功能强大,现描述如下: GDB主要帮忙你完成下面四个方面的功能:
- 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
- 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
- 当程序被停住时,可以检查此时你的程序中所发生的事。
- 动态的改变你程序的执行环境。
编译生成调试信息
一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点
|
|
如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。
启动gdb
使用 gdb <program>就可以启动gdb用于调试程序。
|
|
查看信息
栈信息
不管是操作转储文件还是用GDB设置断点进行调试,都可以输入(GDB)bt打印栈内容进行查看。一般的当机BUG,看下当机的位置,然后看下源代码基本就可以解决了。但是很多情况下简单的(GDB)bt还查不到问题,这时候就要涉及到比较复杂的操作。下面罗列了一些对栈的操作:
|
|
###变量 调试BUG过程中查看变量信息是很有帮助的操作,查看方式如下:
|
|
寄存器
对于调试来说寄存器中的值也很重要,可以查看到当前正在执行的指令的地址等。具体操作罗列如下:
|
|
内存
可以查看具体内存地址中的内容,比如:目前执行的汇编指令,以及栈中内容等。
(GDB) x $pc:显示程序指针指向位置的内容。
(GDB) x/i $pc:显示程序当前位置的汇编指令。
(GDB) x/10i $pc:显示程序当前位置开始往后的10条汇编指令。
(GDB) disassem $pc:反汇编当前函数。简写为:disas $pc。
常见命令
|
|
调试
断点
设置断点
|
|
查看和删除断点
|
|
设置无效和有效断点
|
|
监视点
可以监视某个变量,在变量被访问或者被修改时程序会在当前点进入断点。删除,查看监视点的方式与断点相同。设置监视点方式如下
|
|
条件断点
在调试程序过程中,有时候我们只想在某个条件下停止程序,然后进行单步调试,而条件断点就是为此而设计。下面是条件断点的操作方式:
|
|
断点命令
每次断点发生时候,想要查看的变量很多时,如果每个变量都手动print则需要浪费很多时间。断点命令可以在断点发生时批量执行GDB命令。下面是断点命令的设置方式:
|
|
首先输入GDB命令commands <断点编号>然后回车,这时候会出现>提示符。出现>提示符后可以输入断点发生时需要执行的GDB命令,每行一条,全部输入完成后输入end结束断点命令。
反复执行
单步执行时如果进入了你不关心的函数,你想立即跳出函数;或者进入了大循环中,你想立即循环。下面的命令可以帮到你:
|
|
设置变量值
对变量的值进行控制,可以更快的调试自己的程序。下面就是设置变量值的方法:
|
|
手动生成转储文件:
|
|
Reference
-
No backlinks found.