美文网首页
GDB学习1

GDB学习1

作者: 群里大佬 | 来源:发表于2020-10-31 11:05 被阅读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

    如图:

    打印函数内源码

    今天分享到此结束。

    相关文章

      网友评论

          本文标题:GDB学习1

          本文链接:https://www.haomeiwen.com/subject/jrksvktx.html