gdb调试技巧
gdb调试技巧
多线程调试
在工程中,经常需要写多线程的程序,如果这些多线程的程序出现了问题,需要gdb的时候,我们需要用哪些命令呢?
- info thread 查看当前进程的线程信息,显示ID;
- thread ID 切换调试的线程为指定ID的线程;
- break test.cpp:55 thread all 在test.cpp文件第55行处设置断点,所有的线程都启作用;
- set scheduler-locking off|on|step
- off 不锁定任何线程,也就是所有线程都执行,这是默认值;
- on 锁定其他线程,只有当前线程可以执行;
源文件显示
有些时候,我们在gdb的时候,无法显示源文件。
- directory 设置源文件路径
条件断点
- break line-or-function if expr 例如:break 666 if testsize==100
设置变量
有时候,在调试程序时,我们不单单只是查看运行时的变量,我们还可以直接设置程序中的变量,以模拟一些很难在测试中出现的情况,比较一些出错,或是switch的分支语句。使用set命令可以修改程序中的变量。
另外,你知道gdb中也可以有变量吗?就像shell一样,gdb中的变量以$开头,比如你想打印一个数组中的个个元素,你可以这样:
- set $i = 0
x命令
- x/x 以十六进制输出
- x/d 以十进制输出
- x/c 以单字符输出
- x/i 反汇编 – 通常,我们会使用
x/10i $ip-20 来查看当前的汇编($ip是指令寄存器)
- x/s 以字符串输出