调试前的准备
如果一个程序是可以被调试的,该程序的二进制文件一定加入了一些调试信息!
就好比在VS中,Debug状态下可以调试代码,Release状态下不能调试代码。
在CentOs中默认生成的可执行程序是Release的,所以是不能被调试的,所以如果我们要想生成的可执行程序能被调试,就需要在最后加上-g,同时我们也可以看到带Debug信息的文件比Release文件要大上一些。
![](https://i-blog.csdnimg.cn/blog_migrate/a7970aaf2e7597f78f7aefa1dc587c5e.png)
此时我们再查看段构成中就有了一些debug信息
![](https://i-blog.csdnimg.cn/blog_migrate/72bb61f35f57262121c930f98a4385d6.png)
gdb相关的命令
进入调试 gdb 程序名
如下图想要调试mytest这个程序就要输入 gdb mytest
![](https://i-blog.csdnimg.cn/blog_migrate/40acd4ed504d781f9c3c972724f246e5.png)
退出调试模式 quit
查看可执行程序段构成 readelf -S 程序名
运行程序 run(r)(这个命令类似于VS中的ctrl+F5)
显示源代码 list(l)(每次显示10行代码,再次输入命令会接着上次的位置接着往下再显10行)
显示从某一行开始往后的十行代码 list(l)后跟行号
显示某个函数的代码 list(l)后跟函数名
在某行设置断点 break(b)后跟行号
![](https://i-blog.csdnimg.cn/blog_migrate/67a00f9ce91e9b140a61c0aa1342b0b9.png)
在某个函数开头设置断点 break(b)后跟函数名(给函数打断点实际上打在了函数内部第一行代码上)
显示当前所打的断点 info break(b)
下面红框处的意思是断点现在是启用的,就像VS中的断点启用和禁用一样
![](https://i-blog.csdnimg.cn/blog_migrate/a8656dc96716e61dd04e783b4b797686.png)
删除所有断点 delete breakpoints
删除序号为n的断点 delete n(d n)n代表断点号
禁用序号为n的断点 disable n(n代表断点编号)
启用断点 enable n
下面可以看到禁用断点3后断点状态由yes变成了no
![](https://i-blog.csdnimg.cn/blog_migrate/7f360443e6a25bdb4b61d2bd34f3c8b0.png)
进入函数调用,逐语句 step(s)相当于VS中的F11
单条执行 next(n)相当于VS中的F10
跟踪查看一个变量,每次停下来都显示它的值 display接变量名
跟踪查看一个变量的地址,每次停下来都显示它的值 display接取地址符号(&)变量名
只打印一次变量值 p
取消对先前设置的那些变量的跟踪 undisplay接编号
下图我们取消了跟踪1号变量
![](https://i-blog.csdnimg.cn/blog_migrate/62819e10a132a65604523597837c5aab.png)
执行到当前函数返回,然后停下来等待命令 finish
从当前位置开始连续执行到下一个断点处 continue(c)
跳至X行 until X行号
![](https://i-blog.csdnimg.cn/blog_migrate/4211689dc98136b093ea662f597f1989.png)
查看各级函数调用及参数 breaktrace(bt)
修改变量的值 set var(比如一个for循环中,我想马上调到i为10的情况就可以用这个)