gdb调试器(一)

在默认情况下,gcc在编译时不会把调试符号插入到最终生成的二进制代码(机器代码)中,因为这样会急剧增加可执行程序的大小。如果需要在编译时生成调试符号的信息,则可以采用-g或-ggdb参数。

gcc在产生调试信息时,同样采用了分级的思路(-g1,-g2,-g3),默认的级别是-g2,此时产生的调试信息包括扩展的符号表、行号、局部或外部变量信息。级别-g3包含级别-g2的信息,另外还有源代码中定义的宏。级别-g1不包含局部变量和与行号有关的调试信息,只能用来回溯跟踪和堆栈转储。回溯跟踪指的是监视程序在运行过程中的函数调用历史;堆栈转储则是一种以原始的十六进制格式保存程序执行环境的方法,两者都是经常用到的调试手段。

gcc产生的调试符号具有普遍的适应性,可以被许多调试器加以利用,但如果使用的是gdb调试器,还可以通过-ggdb参数来向最终的二进制代码中增加gdb专用的调试信息,从而可以方便gdb调试器的工作,但缺点是可能会引起其它调试器无法工作。-ggdb能够接受的调试级别与-g是一样的,它们对输出的调试符号具有相同的影响。

注意:任何一个调试选项都会使最终生成的二进制代码文件的体积急剧增大,同时增加程序在执行时的开销,因此调试选项通常仅在软件的开发和调试阶段中使用,最终的产品中不包括调试信息。

[root@localhost work]# gcc -o hello hello.c

[root@localhost work]# ls -l hello

-rwxr-xr-x. 1 root root 8511 Oct 14 08:10 hello //8511 Byte(字节)

[root@localhost work]# gcc -o hello1 -g hello.c

[root@localhost work]# ls -l hello1

-rwxr-xr-x. 1 root root 9503 Oct 14 08:11 hello1  //9503 Byte(字节)

[root@localhost work]# gcc -o hello2 -g3 hello.c

[root@localhost work]# ls -l hello2

-rwxr-xr-x. 1 root root 28919 Oct 14 08:12 hello2    //28919 Byte(字节)

你可能感兴趣的:(C/C++)