在linux下编程的调试工具往往比较少,其中比较有名的就是gdb。而由于程序都是在ARM板子上跑,往往会由于资源不够,连gdb都无法运行。所以之前调试跟踪问题往往也只是用简单的printf来解决,都没怎么用过gdb。但是今天遇到了一个printf无法跟踪的问题,这时才想起来gdb。通过应用gdb,发现gdb功能真是强大,下面记录了一下我用到的命令。
./gdb testprogram :表示用gdb去跑testprogram这个程序,由于我的gdb程序是在当前目录下,所以前面加了./ 如果gdb在系统环境变量的目录中(比如/bin)的话就直接运行gdb testprogram就行。ps:有时候在嵌入式环境下开发的时候经常会用gdb观察core文件,则运行指令则应该是在后面再加上core文件名,比如:./gdb testprogram core
r :表示执行程序,是run的缩写,也可以输入run。如果程序中断后,再输入r的话,表示从头重新执行。
ctrl + c :这个不是输入命令,而是在程序运行过程中,通过这个组合键来实现即时的中断程序。
bt n :在程序被中断运行的情况下,显示程序压栈的情况。其实就是看依次调了那几个函数。n就是表示想要观察的调用层数。
f n :结合bt n使用,使程序状态返回到相应层数的函数作用域中。主要是为了便于观察局部变量。如果不到相应的函数调用层,是无法打印相应作用域的变量的。
p x :print的缩写,打印x变量的值,x可以是表达式。*以及&等都能用,非常强大。
break linenum:设置断点。linenum表示行号。如果一个文件的话,直接写行号就行。如果多个文件的话,可以用文件名:行号的格式,比如break test.c:8 就表示在test.c的第8行设置断点。
cont :continue的缩写,在程序被中断后,输入此命令可使程序继续执行。
next :单步运行程序,遇到函数调用时,next会把该函数调用当作一条语句来执行。
step :单步运行程序,但是和next不同的是当遇到函数调用时,step会跟踪进入函数一次一条的执行函数内的代码。
q :quit的缩写,表示退出gdb。