GDB学习1
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
如图:
打印函数内源码今天分享到此结束。