gdb

原文链接:http://www.orlion.ga/762/

一、单步执行和跟踪函数调用

    对于以下程序

   

    最后打印出的结果是55和5105,而第二个结果应该是5050。现在用gdb调试下。

   

    在编译时要加上-g选项生成的目标文件才能用gdb进行调试,-g作用是在目标文件中加入源代码的信息,比如目标文件第几行机器指令对应源代码的第一行,但并不是把整个源文件嵌入到目标文件中,所以在调试时必须保证gdb也能找到源文件。

    可以用"list"命令从第一行开始列出源代码:

   

    一次只列出10行,如果要继续源代码可以输入list,也可以什么都不敲直接回车,表示使用上一条命令。可以"list 函数名"列出函数的源码:

   

    使用"quit"退出gdb。

    

    使用"start"命令执行程序:

   

    这表示停在main函数中变量定义之后的第一条语句出等待我们发命令,gdb列出这条语句表示它还没执行并且要马上执行,可以用"next"指令控制程序一条条执行。

    可以使用"step"命令进入程序中执行,用"backtrace"命令查看函数调用的堆栈:

   

    可见当前的add_range函数是被main函数调用的,main传进来的参数是low=1, high=10.main函数的栈帧编号为1,add_range的栈帧为0.现在可以用"info"命令查看add_range局部变量的值。如果想查看main函数的局部变量的值可以先用"frame"命令选择1号栈然后再查看局部变量:

   

    (result数组中杂乱无章的数是因为未初始化的局部变量有不确定的值)。用"step"或者"next"往下走,然后用"print"命令打印出局部变量sum的值。

   

    可以使用"finish"命令让程序一直运行到从当前函数返回为止。

   

    

二、断点

    可以使用"break 行号"设置一个断点,也可以"break 函数名";

    然后可以使用"continue"命令继续执行;

    可以设置多个断点,可以使用"info breakpoints"查看所有断点,每个断点都有一个编号,可以输入指令"delete breakpoints 编号"删除指定编号的断点;

    有时一个断点暂时不想用可以禁用而不必删除:"disable breakpoints 编号",启用:"enable breakpoints 编号"。

    还可以设置断点在满足某个条件时才激活:"break 9 if sum != 0"。

三、观察点

    观察点是当程序访问某一存储单元时中断,如果我们不知道某一存储单元在哪里被改动,这时候可以使用观察点,

    命令:"watch 变量名",如"watch array[1]";"info watchpoints"查看设置了哪些观察点。

posted @ 2016-03-24 17:52  orlion  阅读(440)  评论(0编辑  收藏  举报