如何使用 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" ...
随机推荐
- Posche Piwis 3 Original and Clone – What’s the difference
Category : Car Diagnostic Tools What’s the difference between Porsche Tester Piwis III original and ...
- Vue.js 入门教程
Vue.js 入门教程:https://cn.vuejs.org/v2/guide/index.html
- 快速解决PL/SQL Developer过期问题(无需注册码等复杂操作)
第一步:在开始菜单中输入 :regedit 的指令,点击回车,进入注册表编辑器界面 第二步:在注册表里按HKEY_CURRENT_USER\Software\Allround Automations ...
- XML文件的解析—DOM、SAX
一.DOM 解析 思路:获得Document对象,遍历其中节点获得需要的内容 要点: Document : DocuemntBuilderFactory --newDocumentBuilder - ...
- css隐藏多余的文字并出现省略号
<meta charset="utf-8" /> <style> .txt{ width:200px; border:1px solid #ddd; ove ...
- 2T以上磁盘格式化
1.安装软件 对于 Debian/Ubuntu 用户, 使用 APT-GET 命令或者 APT 命令来安装 parted #apt-get install -y parted 对于 RHEL/Cent ...
- eclipse中opencv配置
1.打开Eclipse,Window->preferences 2.进入preferences后,找到Java->Build Path->User Libraries,点击New 在 ...
- windows 2008解决120天授权过期问题(亲测可用)
https://blog.csdn.net/tladagio/article/details/80503198 最后的注册号码可以是:就是那个注册号码:5296992 4954438 6565792. ...
- HDU 5355 Cake (构造 + 暴力)
题意:给定 n,m,让你把 1 ~ n 分成 m 部分,而且每部分和是一样大的. 析:首先先判断不能分成的,第一种是 sum (1 ~ n 的和)不能被 m 整除,或者 sum / m < n, ...
- Linux环境下Redis集群实践
环境:centos 7 一.编译及安装redis源码 源码地址:redis版本发布列表 cd redis-3.2.8 sudo make && make install 二.创建节点 ...