Linux下gdb调试命令介绍

目录

1、断点(breakpoint)

2、观察点(watchpoint)

3、捕捉点(catchpoint)

4、checkpoint解决难以复现的bug

5、使用layout友好界面调试

6、运行程序

7、打印变量值

8、函数

9、调试多线程

10、查看栈信息

11、最后


       C++软件在运行过程中总会存在或多或少、或大或小的bug,有时候我们有充足的时间去分析和解决问题,但更多的时候时间是有限的,我们需要快速的相应。这就要求我们不断地提升调试技巧,不断地积累处理问题的经验。今天我们来大概讲述一下Linux下的gdb调试。

1、断点(breakpoint)

1)设置断点

b Func    表示在Func函数入口设置断点;
b 12        表示在12行设置断点;
如果是多个文件则需要添加作用域,下面这种方式比较常用:
b main.cpp:Func    表示在main.cpp文件中的Func函数入口设置断点;
b main.cpp:12        表示在main.cpp文件中的12行设置断点;
b main.cpp:12        表示在main.cpp文件中的12行设置断点;

2)查看断点

Info breakpoint/break/b        可以查看断点信息

3)清除断点

delete 1        表示删除第一个断点(可以通过2查看断点号)
delete        不带参数表示删除所有断点

2、观察点(watchpoint)

1)watch 表达式(变量) 当表达式值有变化时,马上停止程序;
2)rwatch表达式(变量) expr被读时,马上停止程序;
3)awatch表达式(变量) expr被读或者被写时,马上停止程序;
4)info watch 列出当前设置了的所有观察点;

3、捕捉点(catchpoint)

1)throw  C++抛出异常时中断
2)catch C++捕捉到异常时中断

4、checkpoint解决难以复现的bug

       当我们出现了难以复现的bug时,checkpoint非常有用,它可以让你“悔棋”,返回记录的那个地方重新调试;checkpoint是在那一刻的快照,即在那个地方做个标记,当我们错过的时候通过restart 1(1代表那个checkpoint的id号)回到checkpoint保存的那个程序状态,来重新这一次的调试;加快我们的调试,减少了大量不必要的复现时间。

5、使用layout友好界面调试

       但是layout方式有的时候还有点bug,不过基本上可以使用,可以用ctrl+x和ctrl+a;这样可以很直观的和我们的程序进行比对,方便高效;

1)layout  src        只显示源代码
2)layout     asm        只显示汇编代码
3)layout  split        显示源代码和汇编代码
4)layout  regs        显示源代码和寄存器、或者寄存器和汇编代码

6、运行程序

1)run/r  运行程序;
2)next/n单步跟踪,不进入函数调用;
3)step/s  单步跟踪,进入函数调用;
4)finish  退出函数;
5)until/u 在一个循环体内单步跟踪时,这个命令可以退出循环体;
6)contine/c 继续程序运行;

7、打印变量值

1)x/a     按十六进制格式显示变量;
2)d    按十进制格式显示变量;
3)u     按十六进制格式显示无符号整形;
4)o     按八进制格式显示变量;
5)t     按二进制格式显示变量;
6)c        按字符格式显示变量;
7)f        按浮点数格式显示变量;

       可以使用print(或者p)来查看某变量的值,采用以上列举的几种打印方式即可;或者要一直观察某一个变量的变化情况,则可以使用display来实时观察某个变量的变化;

p/d    dwTotalTime            以十进制格式打印此时dwTotalTime的值;
display/x  dwTotalTime    以十六进制格式实时打印dwTotalTime的值;

        另外,如果想实时改变某个变量的值,也可以使用print(p)或者set来实现,用法如下:

print dwTotalTime=6         把dwTotalTime的值实时改变成6;
set dwTotalTime=3            把dwTotalTime的值实时改变成3;

8、函数

1)函数的强制调用:return expression  返回该表达式的值作为返回值;
2)函数的强制调用:callexpr和print expr 并显示函数的返回值;但如果是void的,不会显示;

9、调试多线程

1)i threads 查看线程的相关信息;
2)thread  thread-num 切换到thread-num;
3)set scheduler-locking[on|off|step],控制当前调试线程和其他线程的执行关系:设为on时,其他线程不会抢占当前线程;设为off,当前调试线程随时可能被抢占;设为step时,执行step不会被抢占,使用next可能被抢占;

10、查看栈信息

       使用bt查看栈信息;通常情况下发生程序崩溃的情况下,使用bt查看栈信息查找崩溃比较有用,可以精确到某个函数。

11、最后

       对于一些必现的问题,我们可以通过gdb实时调试来排查,但对于一些非必现的崩溃,我们则需要使用gdb去分析崩溃时系统捕捉到的Core文件。

猜你喜欢

转载自blog.csdn.net/chenlycly/article/details/126436908