gdb调试

来源:互联网 发布:王者世界韩服数据转移 编辑:程序博客网 时间:2024/06/04 00:51

       编写代码过程中少不了调试。在windows下面,可以使用visual studio工具。在linux下面呢,实际上除了gdb工具之外,没有别的选择。那么,怎么用gdb进行调试呢?我们可以一步一步来试试看。

       调试代码如下

#include <stdio.h>     int iterate(int value)  {      if(1 == value)          return 1;        return iterate(value - 1) + value;  }    int main()  {      printf("%d\n", iterate(10));      return 1;  }  


 

       既然需要调试,那么生成的可执行文件就需要包含调试的信息,这里应该怎么做呢?很简单,输入 gcc test.c -g -o test。输入命令之后,如果没有编译和链接方面的错误,你就可以看到 可执行文件test了。

    调试的步骤基本如下所示,


(01) 首先,输入gdb test


(02) 进入到gdb的调试界面之后,输入list,即可看到test.c源文件


(03) 设置断点,输入 b main 

        break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式:

  break line-number 使程序恰好在执行给定行之前停止。

  break function-name 使程序恰好在进入指定的函数之前停止。

  break line-or-function if condition 如果condition(条件)是真,程序到达指定行或函数时停止。

  break routine-name 在指定例程的入口处设置断点


(04) 启动test程序,输入run 


(05) 程序在main开始的地方设置了断点,所以程序在printf处断住


(06) 这时候,可以单步跟踪。s单步可以进入到函数,而n单步则越过函数


(07) 当程序被停住了,你可以用continue命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用step或next命令单步跟踪程序。

          step <count>

          单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的step in。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。

            next <count>

          同样单步跟踪,如果有函数调用,他不会进入该函数。很像VC等工具中的step over。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。


(08) 希望程序运行到函数结束,输入finish


(09) 查看断点信息,输入 info break


(10) 如果希望查看当前的函数调用栈的所有信息,输入bt

         bt <n>

n是一个正整数,表示只打印栈顶上n层的栈信息。

         bt <-n>

-n表一个负整数,表示只打印栈底下n层的栈信息。


(11) 希望查看内存,输入 x/64 + 内存地址


(12) 删除断点,则输入delete break + 断点序号


(13) 希望查看函数局部变量的数值,可以输入print + 变量名


(14) 希望实时打印变量的数值,可以输入display + 变量名


(15) 查看函数的汇编代码,输入 disassemble + 函数名


(16) 退出调试输入quit即可

 

原创粉丝点击