GDB学习1

2020-10-31  本文已影响0人  群里大佬

vsstudio太大了,喜欢上了vscode,但调试功能不尽如人意,可能我不太会配置。但今天遇到了一个内存错误,试了一下调试鼻祖GDB感觉不错,下面是直接运行时Linux报错信息:

系统报错信息

可以看出来标错很简单,段错误(内存信息已经记录)。

以下是GDB报错信息:

GDB报错

非常详细,告诉你在哪个函数具体到哪一行出错。

这里有个知识点,如何用GDB开始调试一个程序,首先要在编译的时候往程序里加入一些标志信息便于GDB 分析:

gcc xx.c -o xx -g

就是在编译选项最后加上一个-g参数即可,然后就可以正式使用GDB调试程序了,用gdb命令打开你上一步生成的可执行文件。

gdb xx

然后要学习的第一个命令就是(你只要输入r或run按回车即可,(gdb)是系统提示符),这个命令就是用来开始执行程序,有错它会停在出错的地方,并输出错误信息;没有错就正常执行完。

(gdb) r

既然已经定位到错误位置了,接下来就是要在错误位置附近打上一个断点单步执行了,这里要用到断点命令(xxx)表示行数 也可以输入函数名称 这样会在进入指定函数的第一行中断运行:

(gdb) b xxx

然后针对循环的代码,可以搭配使用单步执行和继续运行两个命令,精准定位错误:

(gdb) n   //单步执行 注意是函数内单步,不会进入到调用函数的内部 next

(gdb) c //继续执行,直到下一个断点,常用于循环中定位问题 continue

然后常用的功能还有查看变量值:

(gdb) print xxx

直接打印出变量值,很有效果,我就是通过这个功能查到问题所在:

调试结果

最终通过单步加查看变量两个结合使用,成功定位到错误所在,在将要执行109行时p2已经是一个空指针了,应用中是已经迭代到了链表结尾了,但源程序没有处理这个问题,导致再次调用p2时直接导致内存错误。

还有一个如果不方便打开多个见面,还可以通过list命令打印出程序执行到的函数的原文件内容,

(gdb) l

如图:

打印函数内源码

今天分享到此结束。

上一篇下一篇

猜你喜欢

热点阅读