Linux core dumps 的调试 .

来源:互联网 发布:淘宝模特招聘 编辑:程序博客网 时间:2024/05/21 09:21
前言:
     上篇文章里提到如何生成core dumps,调试core dumps对于linux程序员也是家常便饭,这篇文章介绍在linux系统里如何通过gdb调试core dumps 文件。对于程序的编译,运行那是另外一个话题,此篇文章略过,只谈gdb命令和gdb调试core dumps文件。

gdb简单命令:
     1、开始和停止
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. gdb program.exe  

     装载程序


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. run  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. r < file  
  2. r [argv]  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. help  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. help  [name]  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. quit  
     退出gdb调试程序,简写为q

     2、代码查看和断点
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. list 20  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. list function  

     列出当前函数前后代码


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. info  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. frame      

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. break  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. b n  

     在程序第n行下断点


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. b function  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. delete n  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. watch i == 3  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. print var  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. display val  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. undisplay val  
     取消对变量val的显示

     3、单步调试
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. next  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. step  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. finish  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. continue  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. call function()  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. set x value  
     设置变量x的值为value,在调试程序的时候,可以设置假想值,调试程序还是很方便的。
     
     4、堆栈调试
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. backtrace  

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


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. up  

     上一层堆栈


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. down  

     下一层堆栈


[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. return  
     从当前函数退出,在当前执行函数的下一条执行程式暂停。

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