zoukankan      html  css  js  c++  java
  • Linux core dumps 的调试

    前言:
         上篇文章里提到如何生成core dumps,调试core dumps对于linux程序员也是家常便饭,这篇文章介绍在linux系统里如何通过gdb调试core dumps 文件。对于程序的编译,运行那是另外一个话题,此篇文章略过,只谈gdb命令和gdb调试core dumps文件。

    gdb简单命令:
         1、开始和停止
         gdb program.exe

         装载程序


         run

         运行程序,命令也可以用简写 r


         r < file
         r [argv]

         通过传递文件流, 或者参数运行程序


         help

         帮助命令,简单列出gdb命令信息,简写为h


         help  [name]

         列出具体命令帮助信息,name为命令名


         quit
         退出gdb调试程序,简写为q

         2、代码查看和断点
         list 20

         从当前代码开始,列出20行代码 ,并且指向最后一行,下次再执行list,从当前行开始。如果list参数为空,列出当前10行代码,如果是两个参数,列出范围代码。简写为 l


         list function

         列出当前函数前后代码


         info

         列出当前信息,比如info break,列出断点信息,info stack 列出当前堆栈信息,info frame 列出当前程序执行的程式信息。


         frame    

         当前程序将要执行的程式信息,简写为f


         break

         在当前frame下断点,简写为b


         b n

         在程序第n行下断点


         b function

         在函数内部第一条可执行语句下断点。


         delete n

         删除第n个断点,如果不带参数,删除所有断点,简写为del


         watch i == 3

         设置观察判断语句,一旦程序执行到满足条件的地方,程序停止。这个功能对于循环调试帮助非常大。同时对于空指针,非法值调试起到事半功倍的效果。


         print var

         打印变量值和数据结构,简写为p


         display val

         每执行一条程式,都显示一次变量的值,其实watch才是最佳选择


         undisplay val
         取消对变量val的显示

         3、单步调试
         next

         执行下一条程式,遇到程序直接跳过,简写为n


         step

         执行下一条程式,遇到函数,跳入函数,简写为s


         finish

         执行完程序,并暂停到函数下一行可执行程式。


         continue

         继续运行程序,直到下一个断点暂停,或者如果没有断点,程序执行完毕,退出。简写为c


         call function()

         调用函数,并且可以传递参数,这对调试或者测试来说,太实用了,并且调用函数不影响当前程序的执行。


         set x value
         设置变量x的值为value,在调试程序的时候,可以设置假想值,调试程序还是很方便的。
         
         4、堆栈调试
         backtrace

         显示当前执行程式的堆栈信息,简写为bt


         up

         上一层堆栈


         down

         下一层堆栈


         return
         从当前函数退出,在当前执行函数的下一条执行程式暂停。

    gdb调试core dumps:
         gdb program core
         载入dump文件, program为产生dump的文件,这两个必须要一致,不然符号表和程序完全对不上,如果没有及时发现,会耽误很多时间。运行dump 文件后,程序会停在崩溃程式的那一行,然后就可以通过,print, up, down 这些命令来精确定位程序bug。
         
    总结:
         上面只是罗列出部分gdb命令,gdb, make, gcc 每个工具都足够写一本书的,可能很多人怕麻烦,认为我有Ide,啥都用鼠标搞定,为啥学习这些东西浪费时间。其实磨刀不误砍柴工,ide的可视化界面只不过是加了漂亮的外壳而已,不过不明白原理和基础,在学习和实用C/C++的道路上会遇到更多的问题,花费更加巨量的时间。可能开始感觉学习这些东西浪费时间了,但把这些东西搞透了,后面反而节省了更多的时间。那种方式更高效,显而易见。

    参考资料:
    http://betterexplained.com/articles/debugging-with-gdb/
    http://www.cs.dartmouth.edu/~campbell/cs50/gdb.html
  • 相关阅读:
    H5系列之drag拖放
    H5系列之contenteditable
    H5系列之新input
    利用css3和js实现旋转木马图片小demo
    利用css3实现照片列表展开小demo
    reduce()、filter()、map()、some()、every()、...展开属性
    ES6,ES7,ES8,ES9,ES10新特性
    Web Components 是什么?它为什么对我们这么重要?
    vscode常用快捷键以及插件
    使用for..in时会遍历对象原型中的自定义属性
  • 原文地址:https://www.cnblogs.com/fengju/p/6174309.html
Copyright © 2011-2022 走看看