如何使用 GDB
GDB, The GNU Project debugger, allows you to see what is going on inside another program while it executes – or what another program was doing at the moment it crashed.
GDB 主要完成以下四件事:
- 启动程序,指定影响程序运行的条件。
- 使程序在特定的条件下停止。
- 程序停止时,检查程序锁发生的事。
- 动态的改变程序的执行环境。
前期准备
GDB 一般用于调试C/C++
程序,要想能够使用GDB
调试C/C++
程序,首先必须将调试信息添加到可执行程序中。使用gcc/g++
的-g
参数可以做到这一点。如:
1 |
|
此时,可执行程序programe
中就包含了调试需要的各种信息,如程序函数名、变量名等。 对于 MAC OSX 系统,调试信息会包含在另外一个programe.dSYM
(debug symbols)文件夹下面,可以使用dwarfdump programe.dSYM
直接查看各符号信息。
启动GDB方法
- gdb program就是执行的文件,一般在当前目录下。
- gdb core 用GDB同事调试一个运行程序和 core 文件,core 是程序非法执行后 core dump 后产生的文件。
- gdb 如果程序是一个服务程序,则可以指定服务程序运行时的进程ID。gdb 自动 attach 上去,并调试它。 program 应该在 PATH 环境变量中搜索得到。
如果出现Segment Fault
,可以通过方法 2 来进行 Debug 程序,启动方式为gdb {executable} {dump file}
,如果没有产生 core 文件,需要在执行 executable 之前先执行如下命令:
1 |
|
设置运行参数
set args 可指定运行时参数。(如:set args 10 20 30)
show args 命令可以查看设置好的运行参数。
查看源码
1 |
|
断点break 使用
设置断点的方法
1 |
|
查看断点信息
1 |
|
运行程序
运行程序如下
1 |
|
查看运行时数据
1 |
|
当运行程序到某个位置时,我们希望看看此时程序的状态,比如某个变量的值是否按照预期改变、某块内存的值是否被改。此时就需要用到查看程序运行数据的集中方法。
查看格式 print <expr>
或print /<f> <expr>
,其中<expr>
是要查看的表达式,可以是一个变量、数组、表达式等,<f>
是输出时的格式,比如想要按照 16 进制输出,就使用/x
。
可以使用 examine 命令查看内存地址中的值。格式是x /<n/f/u> <addr>
,其中<addr>
是内存地址。
查看内存数据
在调试代码时,经常需要查看某块内存的数据,此时就需要使用GDB
中的Examining memory。
可以使用命令x
(即examine
)来检查任意格式的内存数据,不管你的程序数据类型。使用的格式为:
1 |
|
其中n/f/u 是选项参数,指定内存的大小及显示格式;addr 指定显示的内存的起始地址。n 是十进制的整数,指定小时内存的大小;f 指定显示的格式,它的使用与 GDB 中的 print 使用的格式一样,如x
指定使用 16 进制显示, d
按十进制格式显示等;u 是指每个显示单元的大小,如b
是指每个显示单元为 byte,h
是指每个显示单元为半字(两个 byte)等;addr 指定要显示的内存的起始地址。
如果需要查看的数据比较多,比如我们需要 dump 一块 buffer 的数据,与特定的数据进行比较,上面提到的examine
就很难实现了。此时需要将块内存 dump 出来。使用到的命令是 dump
或append
或restore
。此处主要介绍dump
命令。
它的格式为:
1 |
|
从格式可以看出,它的含义是从start_addr
开始到end_addr
结束的 memory dump 到 指定的文件 filename 中。
分割窗口
layout 用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法:
- layout src:显示源代码窗口
- layout asm:显示汇编窗口
- layout regs:显示源代码汇编和寄存器窗口
- layout split:显示源代码和汇编窗口
- layout next:显示下一个 layout
- layout prev:显示上一个 layout
- Ctrl+L:刷新窗口
- Ctrl+x,再按1:单窗口模式,显示一个窗口
- Ctrl+x,再按2:双窗口模式,显示两个窗口
- Ctrl+x,再按a:回到传统模式,即退出 layout, 回到执行 layout 之前的调试窗口
问题汇总
- 在工作中经常遇到把编译处的
.o
或.bin
可执行文件,拿到别的路径下运行、Debug,经常遇到GDB
找不到debug src info
的情况,此时可以通过directory
命令指定寻找的路径。
参考文献
- GNU Debugger Tutorial
- GDB: The GNU Project Debugger
- GNU Debugger
- How to Debug Using GDB
- Debugging with GDB
- 用GDB调试程序
- Debugging with GDB: The GNU Source-Level Debugger
- GDB Pocket Reference: Debugging Quickly & Painlessly with GDB
- The Art of Debugging with GDB, DDD, and Eclipse
如何使用 GDB的更多相关文章
- linux应用调试技术之GDB和GDBServer
1.调试原理 GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer.在应用程序调试的时候,pc机上的gdb向开发板上的GDB ...
- 新手如何在gdb中存活
网络上已经有很多gdb调试的文章了,为什么我还要写这篇文章呢,因为本文是写给gdb新手的,目的就是通过一个简单的例子来让新手很快上手.一旦上手入门了,其他的问题就可以自己去搜索搞定了.右边是gdb的L ...
- GDB 多线程调试:只停止断点的线程,其他线程任然执行; 或只运行某些线程 其他线程中断
多线程调试之痛 调试器(如VS2008和老版GDB)往往只支持all-stop模式,调试多线程程序时,如果某个线程断在一个断点上,你的调试器会让整个程序freeze,直到你continue这个线程,程 ...
- GDB调试命令
1.查看源码: list [函数名][行数] 2.暂停程序 (1)设置断点: a.break + [源代码行号][源代码函数名][内存地址] b.break ... if condition .. ...
- 关于gdb和shp的FID问题
gdb的FID从1开始,并且FID唯一,从数字化时开始,每个图形对应唯一的FID,删除图形亦删除对应的FID.FID可能出现中断的情况. shp的FID从0开始,并且永远连续.删除图形,则编号在其下面 ...
- GDB调试命令小结
1.启动调试 前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息.gdb program //最常用的用gdb启动程序,开始调试的方 ...
- gdb 基本知识
一 单步执行和跟踪函数调用 先给出一段代码,可以用下面介绍的例子. #include <stdio.h> int add_range(int low, int high) { int i, ...
- GDB 完全教程
一.简介 GDB是一个功能强大的调试器,它是一个自由软件,能够用在许多UNIX平台上.它同时也是Linux系统中的默认调试器.GDB已被移植到许多其他的计算机平台上,并且能够用于调试嵌入式实时系统.一 ...
- GDB调试汇编堆栈过程分析
GDB调试汇编堆栈过程分析 分析过程 这是我的C源文件:click here 使用gcc - g example.c -o example -m32指令在64位的机器上产生32位汇编,然后使用gdb ...
- gdb可以调试python的pdb么
1.如题: gdb可以调试python的pdb么? 答案:可以,实验如下. 2.实验: 生成一个a.py代码文件,代码如下: import pdb a = 1 print "111" ...
随机推荐
- SQL Server数据库的兼容级别
SQL Server 是Microsoft 公司推出的关系型数据库管理系统.具有使用方便可伸缩性好与相关软件集成程度高等优点,可跨越从运行Microsoft Windows 98 的膝上型电脑到运行M ...
- POS VB
PPSM06S70: Add moddate EDITSPRINTJOB: MAX(TO_CHAR(ETRN.MODDATE, 'yyyy/mm/dd/HH24:MI AM')) ACTUAL_ ...
- 2017沈阳站 Tree
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6228 Tree Time Limit: 2000/1000 MS (Java/Others) M ...
- ssh 免密登录阿里云主机
在网上找了好几篇教程,都不好使. 终于在这篇找到了答案 解决方案: 在 sshd_config 里面将这一项: AuthorizedKeysFile .ssh/authorized_keys 被我修改 ...
- JavaScript变量声明var,let.const
var声明变量的作用域限制在其声明位置的上下文中 var x = 0; // x是全局变量,并且赋值为0. console.log(typeof z); // undefined,因为z还不存在. f ...
- RAM和ROM
RAM:随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器.[1]它可以随时读写(刷新时除外,见下文),而且速度很快,通常作为 ...
- 87、代码适配IphoneX
一.APP在iphoneX运行后不能占满,上下都有多余的边 解决方法:把旧的image.xcassets中的LaunchImage删掉,重新创建并在Images.xcassets中为iPhone X添 ...
- 【翻译】Flume 1.8.0 User Guide(用户指南) source
翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...
- JSOI2018 简要题解
潜入行动 复杂度分析题. 定义状态fi,j,0/1,0/1f_{i,j,0/1,0/1}fi,j,0/1,0/1表示以iii为根子树放jjj个机器iii这个放不放,iii这个是否已放来进行dpdpd ...
- 关于echarts生成雷达图的一些参数介绍
export const industryFactorOption = { title: { text: '雷达图', textStyle: { color: 'rgba(221,221,221,1) ...