【持续更新】GDB使用笔记
多文件程序的调试,例子:
文件结构:
/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使用笔记的更多相关文章
- BLE资料应用笔记 -- 持续更新
BLE资料应用笔记 -- 持续更新 BLE 应用笔记 小书匠 简而言之,蓝牙无处不在,易于使用,低耗能和低使用成本.'让我们'更深入地探索这些方面吧. 蓝牙无处不在-,您可以在几乎每一台电话.笔记本电 ...
- 状压dp(状态压缩&&dp结合)学习笔记(持续更新)
嗯,作为一只蒟蒻,今天再次学习了状压dp(学习借鉴的博客) 但是,依旧懵逼·································· 这篇学习笔记是我个人对于状压dp的理解,如果有什么不对的 ...
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
- ASP.NET MVC 5 系列 学习笔记 目录 (持续更新...)
前言: 记得当初培训的时候,学习的还是ASP.NET,现在回想一下,图片水印.统计人数.过滤器....HttpHandler是多么的经典! 不过后来接触到了MVC,便立马爱上了它.Model-View ...
- [读书]10g/11g编程艺术深入体现结构学习笔记(持续更新...)
持续更新...) 第8章 1.在过程性循环中提交更新容易产生ora-01555:snapshot too old错误.P257 (这种情况我觉得应该是在高并发的情况下才会产生) 假设的一个场景是系统一 ...
- Objective-C Reflection(Objective-C 反射机制)实用随笔笔记(持续更新)
前言:本篇文章就"Objective-C 反射机制"使用方面进行叙述,不会涉及太多理论论述,因为"Objective-C 反射机制"理论论述在网上搜索一大把,本 ...
- ReactNative开发笔记(持续更新...)
本文均为RN开发过程中遇到的问题.坑点的分析及解决方案,各问题点之间无关联,希望能帮助读者少走弯路,持续更新中... (2019年3月29日更新) 原文链接:http://www.kovli.com/ ...
- react-native-storage 使用笔记 持续更新
React-native-storage是在AsyncStorage之上封装的一个缓存操作插件库,刚开始接触这个也遇到了一些问题,在这里简单记录总结一下,碰到了就记下来,持续更新吧 1.安卓下stor ...
- 【oracle笔记1】基础知识大集锦:增删改,数据类型,用户操作,持续更新中···
什么是数据库?数据库就是用来存储和管理数据的仓库.首先我来简单介绍一下各数据库的背景,常见的数据库如下,oracle:甲骨文公司(市场占用率最高),oracle也是一个公司名,翻译过来就是甲骨文的意思 ...
- 【笔记】git 的常用操作命令(持续更新。。。)
项目正在如火如荼的开展,代码量的繁多不得不令我们运用 git 这个有用的工具去管理我们共同协作的代码 git 在这里不作什么介绍了,百度一大堆的教程 首推廖雪峰老师的:http://www.liaox ...
随机推荐
- [Firebase] 2. Firebase Event Handling
/** * Created by Answer1215 on 11/9/2014. */ var app = angular.module('app', ['firebase']); app.cons ...
- [AngularJS] Angular 1.3 $submitted for Form in Angular
AngularJS 1.3 add $submitted for form, so you can use $submitted to track whether the submit event ...
- (C++)浅谈多态基类析构函数声明为虚函数
主要内容: 1.C++类继承中的构造函数和析构函数 2.C++多态性中的静态绑定和动态绑定 3.C++多态性中析构函数声明为虚函数 1.C++类继承中的构造函数和析构函数 在C++的类继承中, 建立对 ...
- ASP.NET HTTP500错误怎么办
如图所示,HTTP500错误. 第一步:"开始"->"设置"->"控制面板"->"管理工具"-> ...
- PHP 图像因其本身有错无法显示怎么办
1 先确认自己的PHP和GD库版本够高,根据PHP手册的要求,PHP最好高于4.0.6,GD库要求2.0.1 2 对于使用PHPNOW的用户,在首页就可以找到相关信息 3 你也可以运行以下代码来检测是 ...
- HDU4626+博弈
博弈... /* 博弈 对于当前人来说,如果完成自己的操作后,若mat[n][m]==0,则自己是胜者. 因为 如果mat其他位置不存在1了,肯定自己胜:如果存在1,则让下一位去反转那个1. */ # ...
- Docker随笔:Hyper-V PowerShell Module is not available报错解决方法
当在win10使用docker-machine创建Hyper-v虚拟机时,返回了一个错误”Error with pre-create check: "Hyper-V PowerShell M ...
- HTTP请求头 If-Modified-Since
来自:http://www.jm47.com/g/91174.htm 一直以来没有留意过HTTP请求头的IMS(If-Modified-Since)标签. 最近在分析Squid的access.log日 ...
- Ajv JSON数据格式校验 使用
1.官网 https://ajv.js.org/ 2.示例代码 <!DOCTYPE html> <html lang="zh"> <head> ...
- PHP文件系统处理
文件系统概述 文件类型 PHP是以UNIX的文件系统为模型的,因此Windows系统中我们只能获得"file"."dir"或者"unk ...