多文件程序的调试,例子:

文件结构:

/demo

  Makefile

  /src

    demo.cpp

    util.cpp

  /include

    util.h

截图:

----------------------------------------------------------------------

-----------------------------------------------------------

注意detach和kill的区别,仔细看文档的说明:

detach

When you have fiished debugging the attached process, you can use the detach
command to release it from gdb control. Detaching the process continues its
execution. After the detach command, that process and gdb become completely

independent once more, and you are ready to attach another process

or start one with run. detach does not repeat if you press RET again after
executing the command.

kill

Kill the child process in which your program is running under gdb.
This command is useful if you wish to debug a core dump instead of a running process.
gdb ignores any core dump fie while your program is running.

On some operating systems, a program cannot be executed outside gdb while you have
breakpoints set on it inside gdb. You can use the kill command in this situation to permit
running your program outside the debugger.

The kill command is also useful if you wish to recompile and relink your program,
since on many systems it is impossible to modify an executable fie while it is running in a
process. In this case, when you next type run, gdb notices that the fie has changed, and
reads the symbol table again (while trying to preserve your current breakpoint settings).

GDB文档下载地址:https://www.gnu.org/software/gdb/documentation/

-----------------------------------------------

如何给被调试的程序设置命令行参数:

gdb demo_exe

set args <arg1> <arg2> <arg3> ...

show args // 查看已设置的命令行参数

或者

gdb demo_exe

run <arg1> <arg2> <arg3> ...

参考资料:http://www.cnblogs.com/rosesmall/archive/2012/04/10/2440514.html

-----------------------------------------------------------

专题-GDB设置断点,变量观察:http://wangjinxin7.blog.163.com/blog/static/1752150162012175255611/

专题-GDB打印变量、指针、结构:http://blog.chinaunix.net/uid-26822401-id-3155297.html

---------------------------------------------------------

这里着重讲一下GDB的TUI模式,尽管没有GUI方便,不过还是比命令行要直观一些的,相比命令行界面最大的好处就是你能直观的看到你当前程序跑到哪个位置了,也不用在GDB和EDITOR之间来回切换,并且你可以在一个窗口中同时查看源代码、汇编代码、寄存器、命令行4个区域(如果你都打开的话)。

其他方面,TUI模式与命令行模式基本没有区别

TUI - Text User Interface,说白了,就是在command-line的窗口上画一个类似GUI的界面,效果图如下

这里主要说一下最基本的也是最常用的使用方法(相关的命令),完整的文档可以去http://www.gnu.org/software/gdb/documentation/下载一个PDF来看,目前TUI的内容在Chapter 25

1.打开/关闭TUI模式

gdb -tui <executable-file-name>

其中<executable-file-name>可选

开关次模式的快捷键是CTRL+X A,意思就是你按着CTRL不放的同时,依次按X,A

2.如果你不需要查看寄存器和汇编指令的话,只打开源代码窗口(src)和命令窗口(cmd)即可

layout src

3.另外,如果你需要在源代码窗口按KEY_UP,KEY_DOWN,KEY_LEFT,KEY_RIGHT,KEY_PGUP,KEY_PGDN,KEY_HOME,KEY_END进行代码查看的话,使用如下命令可以切换到带源代码窗口

focus src

类似的如果你需要在命令窗口使用KEY_UP,KEY_DOWN查看命令的话,使用如下命令切换到命令窗口

focus cmd

------------------------------------------------------------

命令的话,这里大多数只写缩写的格式。可以打开GDB后输入help查看帮助,或者直接去看documentation或网上的教程

n

单步(step over, next)

break <function-name>

给某个函数打断点

break <line-number>

在某一行打断点

l <line-number>

<line-number>可以不要,如果没有<line-number>,则从第一行开始列出源码(list)

ENTER

执行上一次命令

info break

查看断点信息

r

运行程序(run)

p <variable-name>

打印变量的值(print)

bt

查看调用栈(backtrace)

finish

退出函数

c

继续运行直到遇到下一个断点(continue)

q

退出GDB(quit)

info locals

查看局部变量

info watch

查看监视

break <line-number/function-name> if <condition>

满足<condition>的情况下在特定的行或函数中断,condition是程序中合法的boolean表达式

condition <break-point number> <condition>

给已存在的断点设置中断条件

delete/disable/enable <break-point number/watch number>

删除/启用/禁用 断点/监视

watch <condition>

添加监视,满足<condition>的情况下中断,condition是程序中合法的boolean表达式

frame <#frame-number>

切换frame(其实一个frame就是调用栈的一层),可以结合info locals查看调用栈各层的local变量,利用bt命令可以查看当前调用栈的所有frame(#0为栈顶frame)

set <variable-name>=<variable-value>

给变量设置新值,比如你有一个char buf[255]你可以在GDB调试的时候输入set *buf='M'从而把buf[0]修改为‘M’,你可以通过p buf来查看

----------------------------------------------------------------------

我的GDB学习路线:

// 介绍了最最最基础的命令

http://blog.csdn.net/haoel/article/details/2879

// 下面这一篇非常重要,必看

http://www.ibm.com/developerworks/cn/linux/sdk/gdb/index.html

上面那篇讲到core dump file的时候,如果发现无法产生core dump file,则参考这篇文章:http://www.cnblogs.com/qrlozte/p/4435065.html

另外,上面那篇讲到连接进程的内容的时候,一般要用sudo命令提供root密码才行,比如

sudo gdb demo_exe attach 28688

或者,拆开为3条命令

sudo gdb

// 输入root密码

file demo_exe

attach 28688 // ./demo_exe & 可以查看到process id

http://www.programlife.net/gdb-manual.html

  @

【持续更新】GDB使用笔记的更多相关文章

  1. BLE资料应用笔记 -- 持续更新

    BLE资料应用笔记 -- 持续更新 BLE 应用笔记 小书匠 简而言之,蓝牙无处不在,易于使用,低耗能和低使用成本.'让我们'更深入地探索这些方面吧. 蓝牙无处不在-,您可以在几乎每一台电话.笔记本电 ...

  2. 状压dp(状态压缩&&dp结合)学习笔记(持续更新)

    嗯,作为一只蒟蒻,今天再次学习了状压dp(学习借鉴的博客) 但是,依旧懵逼·································· 这篇学习笔记是我个人对于状压dp的理解,如果有什么不对的 ...

  3. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  4. ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)

    前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...

  5. [读书]10g/11g编程艺术深入体现结构学习笔记(持续更新...)

    持续更新...) 第8章 1.在过程性循环中提交更新容易产生ora-01555:snapshot too old错误.P257 (这种情况我觉得应该是在高并发的情况下才会产生) 假设的一个场景是系统一 ...

  6. Objective-C Reflection(Objective-C 反射机制)实用随笔笔记(持续更新)

    前言:本篇文章就"Objective-C 反射机制"使用方面进行叙述,不会涉及太多理论论述,因为"Objective-C 反射机制"理论论述在网上搜索一大把,本 ...

  7. ReactNative开发笔记(持续更新...)

    本文均为RN开发过程中遇到的问题.坑点的分析及解决方案,各问题点之间无关联,希望能帮助读者少走弯路,持续更新中... (2019年3月29日更新) 原文链接:http://www.kovli.com/ ...

  8. react-native-storage 使用笔记 持续更新

    React-native-storage是在AsyncStorage之上封装的一个缓存操作插件库,刚开始接触这个也遇到了一些问题,在这里简单记录总结一下,碰到了就记下来,持续更新吧 1.安卓下stor ...

  9. 【oracle笔记1】基础知识大集锦:增删改,数据类型,用户操作,持续更新中···

    什么是数据库?数据库就是用来存储和管理数据的仓库.首先我来简单介绍一下各数据库的背景,常见的数据库如下,oracle:甲骨文公司(市场占用率最高),oracle也是一个公司名,翻译过来就是甲骨文的意思 ...

  10. 【笔记】git 的常用操作命令(持续更新。。。)

    项目正在如火如荼的开展,代码量的繁多不得不令我们运用 git 这个有用的工具去管理我们共同协作的代码 git 在这里不作什么介绍了,百度一大堆的教程 首推廖雪峰老师的:http://www.liaox ...

随机推荐

  1. 在上已个Java Spring MVC项目基础上加MyBatis

    代码目录: /Users/baidu/Documents/Data/Work/Code/Self/HelloSpringMVC 1. 首先在resource目录加上jdbc.properties: d ...

  2. C# 怎么显示中文格式的星期几

    1.DateTime.Now.ToString("dddd",new System.Globalization.CultureInfo("zh-cn")); 2 ...

  3. 转:sublime2 官方网址

    1. sublime2 官方网址 http://www.sublimetext.com/2

  4. 无需编码开发快速设计互动式UI - uilang

    uilang是一个非常小巧的ui类库,可以帮助不熟悉前端代码的web设计人员快速的开发互动式UI.你只需要使用“语义式”的说明来控制元素的动态效果. 开发中你只需要在<code>标签内部输 ...

  5. angularjs中的ng-src和ng-href

    ng-src和ng-href等同于html中的src和href,只是ng是在dom加载完毕之后才能够发挥作用,如果在src或href中绑定变量,如果ng没有加载完,会导致链接地址出错,如果用对应的ng ...

  6. UDP socket也可以使用connect系统调用

    UDP socket也可以使用connect系统调用 UDP是一个无连接的协议,因此socket函数connect()似乎对UDP是没有意义的,然而事实不是这样.它可以用来指定本地端口和本地地址,来建 ...

  7. Mysql5.7.22版本,插入中文乱码的问题

    首先,mysql5.7.22版本的免安装版本的,需要自己配置信息,而且容易出现问题,这里还是建议下载安装版本.msi,按照安装教程进行安装:安装成功后会在数据存储的data文件下找到参数配置文件my. ...

  8. win7 配置IIS + php 环境

    一:开启win7 的IIS功能:并开启 CGI 二:下载php5 for windows 解压 三:打开IIS --->>处理程序映射- 参考:http://php.net/manual/ ...

  9. 手动脱UPX 壳实战

    作者:Fly2015 Windows平台的加壳软件还是比較多的,因此有非常多人对于PC软件的脱壳乐此不彼,本人菜鸟一枚,也学习一下PC的脱壳.要对软件进行脱壳.首先第一步就是 查壳.然后才是 脱壳. ...

  10. 执行次数最多的sql语句

    执行次数最多的sql语句 * FROM ( creation_time N'语句编译时间' ,DB_NAME(st.dbid) AS dbname ,OBJECT_NAME(st.objectid) ...