打算调试某个程序的话,请在编译的时候加上 -g 选项。
如果想要在更多的符号信息,比如 宏定义的信息,请加 -g3 选项。
多个相关选项被将如的话,前面的选项会被后面的覆盖掉。
比如源代码是 hello.c编译的时候,可以这样。
gcc -g hello.c
这是最简单的方式。此时会生成 一个 a.out 的可执行程序。想要调试它?这么做。
gdb a.out
此时会进入gdb模式。
如果要运行程序,这样做。
run
r #以下均是简写
ru
注意,井号符之后的字符是注释。此时这样运行,程序会运行到底,不会中途暂停。怎么办?加上断点即可。比如在 main 函数的开始位置加断点。break main
b main #以下均是简写
br main
bre main
brea main
想要检查都加了那些断点。怎么做?
info breakpointsi breakpoints #以下都是简写
i b
i br
i bre
i brea
i break
i breakp
i breakpo
i breakpoi
i breakpoin
i breakpoint
如果断点已经正常加入了。可以运行程序了。
run
当程序运行到断点的位置,会暂停。此时,就可以查看该位置的内存中的很多变量的值。
以便检测是否符合预期如果想要查看变量 i的值。这么做。
print i
p i
pr i
pri i
prin i
如果变量的值没有问题。那么就让程序继续执行。怎么做?
next #可以让程序运行到该源代码文件的下一个指令(大概理解就是运行到下一行)n执行完next后,如果想继续走一行的话,直接回车即可(这很方便)。
如果执行到了某个函数处,想要进入这个函数。怎么做?
step
s
进入这个函数之后,如果还是直接按下回车。就会再次执行step一次。所以常常会输入next一次,然后就可以在这个函数中一行一行的运行代码。这个函数太长。想要直接从这个函数跳出来。怎么做?
finish
fin
fini
finis
此时就会跳回到刚刚执行step前的下一行代码。
注意如果想要继续一行一行的执行代码,就再次执行一下next吧。
然后,就可以直接按下回车,一行银行的调试代码。
如果,在调试中发现某个变量的值是错的。比如 某个 int 类型的变量 i 期待的应该值应该是 1,但是实际上它竟然是2。你觉得应该怎么办?
是退出程序,改代码,重新编译再调试吗?这太慢啦。在gdb里面你可以“为所欲为”。这么做。
set variable i = 1
set i = 1
print i = 1
p i = 1
pr i = 1
pri i = 1
prin i = 1
这样就可以了,不信?你可以检测的。
print i
这样的话,就可以继续执行了。把所有的错误尽量都在最后一起修改。
上面的方法对于 兼容 int 类型的变量都是可以实现的。
但是对于字符串,这么做是不行的。比如有个字符串 array=“hello”,
而你可能需要它的值是“world” 那么怎么做?
call strcpy(array, “world”)
这么做就可以了。对,你可以调用函数,这是值得称赞的方法。
注意这个函数被声明在 string.h 文件中,那么你的代码得先包含这个头文件。这是关键条件。
所有你能“看见”的函数都可以被调用。可以检验这个数组的值。
print array
如果,想要中途停止运行这个程序。怎么办?
kill inferior 1
这样就可以把这个调试会话关闭。然后,你就可以安全退出gdb了。
quit
q
qu
qui
到此一个简单的调试任务就完成了。
--- 来自编者
gdb 是强大的,请等待后续更加深入的探讨。