Linux下gdb调试命令介绍
Posted dvlinker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下gdb调试命令介绍相关的知识,希望对你有一定的参考价值。
目录
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文件。
以上是关于Linux下gdb调试命令介绍的主要内容,如果未能解决你的问题,请参考以下文章