Linux下C编程基础之:gdb调试器
用户在断点键入"backrace"(只输入"bt"即可)可以查到调用函数(堆栈)的情况,这个功能在程序调试之中使用非常广泛,经常用于排除错误或者监视调用堆栈的情况。
(gdb) b 19
(gdb) c
Breakpoin 2, sum(m=50) at test.c:19
19printf("The sum of 1-m is %d\n", n);
(gdb) bt
#0 sum(m=50) at test.c:19 /* 停在test.c的sum()函数,第19行*/
#1 0x080483e8 in main() at test.c:6 /* test.c的第6行调用sum函数*/
(4)运行代码。
接下来就可运行代码了,gdb默认从首行开始运行代码,键入"r"(run)即可(若想从程序中指定行开始运行,可在r后面加上行号)。
(gdb) r
Starting program: /root/workplace/gdb/test
Reading symbols from shared object read from target memory...done.
Loaded system supplied DSO at 0x5fb000
Breakpoint 1, main () at test.c:6
6 sum(50);
可以看到,程序运行到断点处就停止了。
(5)查看变量值。
在程序停止运行之后,程序员所要做的工作是查看断点处的相关变量值。在gdb中键入"p"+变量值即可,如下所示:
(gdb) p n
$1 = 0
(gdb) p i
$2 = 134518440
在此处,为什么变量"i"的值为如此奇怪的一个数字呢?原因就在于程序是在断点设置的对应行之前停止的,那么在此时,并没有把"i"的数值赋为零,而只是一个随机的数字。但变量"n"是在第4行赋值的,故在此时已经为零。
小技巧 | gdb在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,所以以后若想再次引用此变量就可以直接写作"$N",而无需写冗长的变量名。 |
(6)单步运行。
单步运行可以使用命令"n"(next)或"s"(step),它们之间的区别在于:若有函数调用的时候,"s"会进入该函数而"n"不会进入该函数。因此,"s"就类似于Uisual等工具中的"step in","n"类似与Uisual等工具中的"step over"。它们的使用如下所示:
(gdb) n
The sum of 1-m is 1275
7for (i = 1; i <= 50; i++)
(gdb) s
sum (m=50) at test.c:16
16 int i, n = 0;
可见,使用"n"后,程序显示函数sum()的运行结果并向下执行,而使用"s"后则进入sum()函数之中单步运行。
(7)恢复程序运行
在查看完所需变量及堆栈情况后,就可以使用命令"c"(continue)恢复程序的正常运行了。这时,它会把剩余还未执行的程序执行完,并显示剩余程序中的执行结果。以下是之前使用"n"命令恢复后的执行结果:
(gdb) c
Continuing.
The sum of 1-50 is :1275
Program exited with code 031.
可以看出,程序在运行完后退出,之后程序处于"停止状态"。
小知识 | 在gdb中,程序的运行状态有"运行"、"暂停"和"停止"3种,其中"暂停"状态为程序遇到了断点或观察点之类的,程序暂时停止运行,而此时函数的地址、函数参数、函数内的局部变量都会被压入"栈"(Stack)中。故在这种状态下可以查看函数的变量值等各种属性。但在函数处于"停止"状态之后,"栈"就会自动撤消,它也就无法查看各种信息了。 |
3.4.2 gdb基本命令
gdb的命令可以通过查看help进行查找,由于gdb的命令很多,因此gdb的help将其分成了很多种类(class),用户可以通过进一步查看相关class找到相应命令,如下所示:
(gdb) help
List of classes of commands:
aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
…
Type "help" followed by a class name for a list of commands in that class.
Type "help" followed by command name for full documentation.
Command name abbreviations are allowed if unambiguous.
上述列出了gdb各个分类的命令,注意底部的加粗部分说明其为分类命令。接下来可以具体查找各分类的命令,如下所示:
(gdb) help data
Examining data.
List of commands:
call -- Call a function in the program
delete display -- Cancel some expressions to be displayed when program stops
delete mem -- Delete memory region
disable display -- Disable some expressions to be displayed when program stops
…
Type "help" followed by command name for full documentation.
Command name abbreviations are allowed if unambiguous.
若用户想要查找call命
- Linux下C编程基础之:常用编辑器(08-13)
- Linux下C编程基础之:gcc编译器(08-13)
- Linux下C编程基础之:make工程管理器(08-13)
- Linux下C编程基础之:使用autotools(08-13)
- Linux下C编程基础之:实验内容(08-13)
- Linux下C编程基础之:本章小结与思考与练习(08-13)