正文
再学C/C++ 之 浅析gdb的-g选项
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
浅析gdb的-g选项
准备
gdb是Linux下学习C/C++最常用的debug工具。要使用这一强大工具,必须在编译时加上-g选项,生成的目标文件才可以用gdb进行调试。
如,先创建一个test.c文件,内容为:
#include <stdio.h> int main(void){
int a[];
a[] = ;
a[] = ;
return ;
}
使用编译语句,进行编译:
gcc -g test.c -o test.out
浅析-g选项
-g选项的作用就是在编译生成的目标文件中加入源码信息。例如,把目标文件中的机器指令与源代码的行数对应起来。
注意,这里并不是将整个源码都添嵌入到目标文件中,而是只是添加对应的行数信息
,因此,在进行debug的时候,必须保证gdb可以找到源文件。
下面做一个小测试进行验证:
(1)先针对上面的文件调试:
gdb test.out
(gdb) start
如下:
可以看到,第一个breakpoint是第5行,且源码为:
a[0] = 1;
这个时候,如果在源文件中的第一和第三行间添加1行,然后再运行gdb(注意,不要在运行gcc编译)
gdb test.out
(gdb) start
此时,发现gdb中第一个breakpoint仍为第5行,但是,源码却为原来的上一行。
由此,验证了我们的说法:“gdb只是添加对应的行数信息,而非嵌入源代码”。
扩展
-g 选项具有三个等级。即:
-g1
不包含局部变量和与行号有关的调试信息,因此只能够用于回溯跟踪和堆栈存储和函数的调用等等。
-g2
默认的级别,此时产生的调试信息包括扩展的符号表、行号、局部或外部变量信息
-g3
包含级别2中的所有调试信息,以及源代码中定义的宏