博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gdb
阅读量:6655 次
发布时间:2019-06-25

本文共 1147 字,大约阅读时间需要 3 分钟。

原文链接:

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

    对于以下程序

   

    最后打印出的结果是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"查看设置了哪些观察点。

转载于:https://www.cnblogs.com/orlion/p/5316504.html

你可能感兴趣的文章
iOS Development Sites
查看>>
2018-2019-1 20165320 《信息安全系统设计基础》第四周学习总结
查看>>
Church 整数前驱的推导
查看>>
git push之后回滚(撤销)代码
查看>>
暑假练习赛 006 E Vanya and Label(数学)
查看>>
Toxophily
查看>>
C# 中的委托和事件(转)
查看>>
专业实训题目需求分析
查看>>
MyEclipse定位class文件
查看>>
Wireshark的过滤规则
查看>>
bzoj1592[Usaco2008 Feb]Making the Grade 路面修整*
查看>>
ios中PagedFlowView的用法
查看>>
pcl_view简单使用
查看>>
[数据安全] 一个简洁快速的去数据特征的混淆算法(obfuscate)
查看>>
Android开源框架:初识ButterKnife
查看>>
[待补充]面向接口编程,数据驱动编程
查看>>
bzoj1502: [NOI2005]月下柠檬树
查看>>
拓扑排序
查看>>
100道java基础面试题
查看>>
docker基本使用
查看>>