gdb调试小结

gdb命令详解 Linux命令之gdb 0. 简述 GDB(GNU symbolic debugger)简单地说就是一个调试工具。它是一个受通用公共许可证即GPL保护的自由软件。 一般来说,GDB主要帮助你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。 3、当程序被停住时,可以检查此时你的程序中所发生的事。 4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG 正因为GDB是linux下最常使用的程序调试器,因此, 阅读详情

一、启动

1、gdb <program>

当以gdb <program>方式启动gdb后,gdb会在PATH路径和当前目录中搜索<program>的源文件。如要确认gdb是否读到源文件,可使用l或list命令,看看gdb是否能列出源代码。
使用(gdb)r或run命令运行程序。

2、调试在线进程

(1)启动gdb时链接目标进程

在启动gdb的时候,通过参数-p指定目标进程,就可以进入调试状态。刚链接成功后,程序是暂停运行状态,你可以进行设置断点等操作,然后输入(gdb) c 命令继续运行。命令如下:

>gdb -p <PID>:PID是进程ID,可以通过`>ps aux | grep <程序名> `获得。
或者直接 >gdb -p  `pidof <程序名>` 也可以。

(2)gdb中链接目标进程:

 (gdb) attach <PID>

(3)断开链接:

 (gdb) detach

二、信息显示

1、栈信息

不管是操作转储文件还是用gdb设置断点进行调试,都可以输入(gdb)bt打印栈内容进行查看。一般的当机BUG,看下当机的位置,然后看下源代码基本就可以解决了。但是很多情况下简单的(gdb)bt还查不到问题,这时候就要涉及到比较复杂的操作。下面罗列了一些对栈的操作:

(gdb) bt:显示所有栈帧,backtrace。
(gdb) bt 10:显示前面10个栈帧。
(gdb) bt -10:显示后面10个栈帧。
(gdb) bt full:显示栈帧以及局部变量。
(gdb) bt full 10:显示前面10个栈帧以及局部变量。
(gdb) bt full -10:显示后面10个栈帧以及局部变量。
(gdb) frame <栈帧编号>:进入指定的栈帧中,然后可以查看当前栈帧中的局部变量,以及栈帧内容等信息。
(gdb) info frame <栈帧编号>:可以查看指定栈帧的详细信息。
(gdb) up:进入上层栈帧。
(gdb) down:进入下层栈帧。

2、变量

调试BUG过程中查看变量信息是很有帮助的操作,查看方式如下:

 (gdb) p <变量名>
 (gdb) set variable <变量> = <表达式>:将变量的值设定为指定表达式的值。例如 set variable x=10
 (gdb) print <变量> = <表达式>:查看并修改变量

3、寄存器

对于调试来说寄存器中的值也很重要,可以查看到当前正在执行的指令的地址等。具体操作罗列如下:

(gdb) `info reg`:显示所有寄存器。可以简写为:i r。如果要查看具体的寄存器可以这样:`i $ebx`
(gdb) `p $eax`:显示eax寄存器内容。
(gdb) `p/c $eax`:用字符显示eax寄存器内容

反斜杠后面的是显示格式,可使用的格式见下表:该表在显示内存内容的x命令中也是通用的。

格式说明
x显示为十六进制数
d显示为十进制数
u显示为无符号十进制数
o显示为八进制数
t显示为二进制数
a显示为地址
c显示为字符(ASCII)
f显示为浮点小数
s显示为字符串
i显示为机器语言(仅在显示内存的x命令中可用)

4、内存

可以查看具体内存地址中的内容,比如:目前执行的汇编指令,以及栈中内容等。

(gdb) `x $pc`:显示程序指针指向位置的内容。
(gdb) `x/i $pc`:显示程序当前位置的汇编指令。
(gdb) `x/10i $pc`:显示程序当前位置开始往后的10条汇编指令。
(gdb) `disassem $pc`:反汇编当前函数。简写为:`disas $pc`。

5、源代码

(gdb) `list <linenum>`:显示程序第linenum行的周围的源程序。
(gdb) `list <function> `:显示函数名为function的函数的源程序。
(gdb) list :显示当前行后面的源程序。
(gdb) list - :显示当前行前面的源程序。

6、显示格式

(gdb)set print pretty on:如果打开printf pretty这个选项,那么当gdb显示结构体时会比较漂亮。
(gdb)set print array on:打开数组显示,打开后当数组显示时,每个元素占一行,如果不打开的话,每个元素则以逗号分隔。

三、断点

1、设置断点

(gdb) break <函数名>:对当前正在执行的文件中的指定函数设置断点。可简写为:(gdb) b <函数名>
(gdb) break <行号>:对当前正在执行的文件中的特定行设置断点。可简写为:(gdb) b <行号>
(gdb) break <文件名:行号>:对指定文件的指定行设置断点。最常用的设置断点方式。可简写为:(gdb) b <文件名:行号>
(gdb) break <文件名:函数名>:对指定文件的指定函数设置断点。可简写为:(gdb) b <文件名:函数名>
(gdb) break <+/-偏移量>:当前指令行+/-偏移量出设置断点。可简写为:b <+/-偏移量>
(gdb) break <*地址>:指定地址处设置断点。可简写为:b <*地址>
(gdb) tbreak <函数名>:设置临时断点,只生效一次。可简写为:(gdb) tb <函数名>

2、 查看、删除断点

(gdb) info break :显示所有断点以及监视点。可简写为:(gdb) i b
(gdb) delete <编号>:删除编号指向的断点或者监视点。可简写为:(gdb) d <编号>
(gdb) clear <行号>:删除改行的断点。
(gdb) clear <文件名:行号>:删除改行的断点。

3、设置无效、有效断点:

(gdb) disable <断点编号> : 当前断点设置为无效。
(gdb) enable <断点编号>:当前断点设置为有效。

4、条件断点

在调试程序过程中,有时候我们只想在某个条件下停止程序,然后进行单步调试,而条件断点就是为此而设计。下面是条件断点的操作方式:

(gdb) b <断点> if <条件表达式> : 例如:b main.cpp:8 if x=10 && y=10
(gdb) condition <断点编号>:删除该断点的条件。
(gdb) condition <断点编号> <条件表达式>:修改断点条件。例如:condition 1 x=10 && y=10

5、监视点

可以监视某个变量,在变量被访问或者被修改时程序会在当前点进入断点。删除,查看监视点的方式与断点相同。设置监视点方式如下:

(gdb) watch <表达式>:表达式发生变化时暂停。
(gdb) awatch <表达式>:表达式访问或者改变时暂停。
(gdb) rwatch <表达式>:表达式被访问时暂停。
(gdb) info watchpoints:列出当前所设置的所有观察点。

6、断点命令

每次断点发生时候,想要查看的变量很多时,如果每个变量都手动print则需要浪费很多时间。断点命令可以在断点发生时批量执行gdb命令。下面是断点命令的设置方式:

(gdb) commands <断点编号>
(gdb) >print x
(gdb) >print y
(gdb) >end

首先输入gdb命令commands <断点编号>然后回车,这时候会出现>提示符。出现>提示符后可以输入断点发生时需要执行的gdb命令,每行一条,全部输入完成后输入end结束断点命令。

四、其他

1、强制函数返回

如果你的调试断点在某个函数中,并还有语句没有执行完。你可以使用return命令强制函数忽略还没有执行的语句并返回。

return
return <expression>

使用return命令取消当前函数的执行,并立即返回,如果指定了,那么该表达式的值会被认作函数的返回值。

2、强制调用函数

call <expr>

表达式中可以一是函数,以此达到强制调用函数的目的。并显示函数的返回值,如果函数返回值是void,那么就不显示。

另一个相似的命令也可以完成这一功能——print,print后面可以跟表达式,所以也可以用他来调用函数,print和call的不同是,如果函数返回void,call则不显示,print则显示函数返回值,并把该值存入历史数据中。

参考

100个gdb小技巧
gdb调试器使用总结
陈皓-用gdb调试程序

深入解析gdb -p 与gdb attach 的区别与使用场景 在Linux系统中,GDB(GNU Debugger)是一款功能强大的调试工具,广泛应用于程序开发和调试过程。在使用GDB进行调试时,我们常常需要将GDB附加到正在运行的进程上。本文将对比两种附加进程的方法:gdb -p 和gdb attach ,分析它们的区别和使用场景。本文详细对比了gdb -p 与gdb attach 的使用方法、场景及优缺点。摘要:本文将详细对比gdb -p 与gdb attach 这两个命令的使用方法、场景及优缺点,帮助读者更好地理解并运用这两个调试工具。 阅读详情

相关推荐

全网最全GDB调试整理

gdb调试相关整理

littleboy_IT 1687

GDB调试相关命令解析

一、启动 1、gdb 2、调试在线进程 (1)启动gdb时链接目标进程(2)gdb中链接目标进程:(3)断开链接: 二、信息显示 1、栈信息2、变量3、寄存器4、内存5、源代码6、显示格式 三、断点 1、设置断点2、...

sdsszk的博客 1546

GDB调试场景小结

针对GDB(GNU 调试器)高级调试命令与调试脚本语法常用与高级命令高级调试技巧与用法GDB 脚本语法与用例实用脚本范例。

weixin_42804968的博客 211

GDB调试程序(四)

查看栈信息—————当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用GDB命令来查看当前的栈中的信息。下面是一些查看函数调用栈信息的GDB命令:    backtrace     bt         打印当前的函数调用栈的所有信息。如:               

陈皓专栏 【空谷幽兰,心如皓月】 5万+

GDBGDB调试学习小结

0x00 前言 文章中的文字可能存在语法错误以及标点错误,请谅解; 如果在文章中发现代码错误或其它问题请告知,感谢! GDB version: 8.1.0.20180409-git 系统版本:Ubuntu 18.04.4 LTS \n \l 最后更新:2021-11-19 0x01 学习小结 1.GDB简介 (1)GDB是什么? GDB, the GNU Project debugger, allows you to see what is going on `inside’ another program

C/C++攻城狮 1090

GDB调试 小结

本文介绍使用GDB进行C调试 1.编写调试测试代码如下 bugging.c--1到100的求和函数,代码调试 /* bugging.c */ #include <stdio.h> int foo(int n) { int sum; int i; for (i=0; i<=n; i++) { sum = sum+i; } return sum; } int main(int argc, char** a...

萧西朗的博客 527

常用的GDB调试小结

gdb的目的主要是让你知道程序内部正在运行什么代码,或者是当程序崩溃的时候正在执行什么代码 GDB主要可以做四种事情来帮助你找到bug: 启动你的程序,指定任意可以影响程序行为的参数。 让你的程序在指定的条件停住. 测试你的程序停止的时候发生了什么。 改变程序内部的变量,来改正程序的错误继续执行。 ...

u012919476的博客 1473

gdb调试使用小结

gdb安装 一般linux系统中都安装好了,如果没有可以使用下面命令 #:apt-get update #:apt-get install gdb gdb使用 一般要使用gdb调试某个程序,都需要程序中带了符号表,这样才能清晰的看到调试的每一行代码、调用的堆栈信息、变量名、函数名、寄存器、内存信息等,所以使用gcc编译程序时,需要加上 -g 选项: gcc test.c -g -...

夏天Alex 1042

GDB调试小结

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

NicolasNRH的博客 396

gdb调试基本命令小结

在debug阶段,gdb是个很强大的工具,今天大葱敏有幸为大家总结一下一些gdb的基本命令(其实是最基本的),希望能对看到这篇文章的你有所帮助。 1)进入gdb  gdb test   这里的test是要调试的程序,由gcc test.c -g -o test(C++对应用g++)生成。进入后提示符变为 (gdb) 。 2)查看源码  (gdb) l   源码会进行行号提示。而且后边单步

大葱敏的博客 2542

GDB:break断点调试小结

GDB:break断点调试常用命令参考资料 常用命令 举个例子: 假设我们有main.c文件中有add()函数,break指令可用b缩写替代。 1)普通断点,运行到指定位置就停止 b 6 // 表示在程序开始第6行暂停 b +6 // 表示在当前暂停位置往后偏移6行,打个断点 b -6 // 表示在当前暂停位置往前偏移6行,打个断点 b add // 表示在程序中函数add开头处暂停 b test.c:6 // 表示在test.c文件的第6行暂停 b test.c:add // 表

来知晓的博客 1883

gdb 调试命令小结

首先编译代码为可执行文件 gcc -wall -g helloworld.c hello -g要加入 方便以后的gdb调试 步骤: gdb hello   ----启动gdb run             执行代码   后面可以传入参数 如run a b c        可以简写为r q               退出gdb p filedName     打印出变量值

lhs286266503的专栏 900

GDB 调试小结

关于gdb调试和make(makefile)自动编译一、Linux中gdb那不可缺少的工具 作为一个程序员,最怕出现的就是bug,特别是刚踏入这一行的新手来说更是致命的伤,话又说回来,同一个程序猿对不同bug的恐惧程度也是不同的,我个人觉得出现bug不可怕,可怕是的程序能运行,但是运行结果出乎你的预料,这时候你就 需要一个得心应手的“武器”来帮你解决这个问题,没错 就是 gdb

orderour的博客 287

一步一步学调试——gdb命令小结

1.进入gdb: #gdb test -q(uiet) 其中test为目标可执行文件,-q代表不打印那一大串版本版权信息之类的刷屏字幕。 这里有个小常识就是用gcc编译目标文件test时,记得-g,表示可调试。 另外,直接进入gdb而未加载可执行文件,或者加载了目标文件,想换一个其他的——可以使用 (gdb)file test2 或者 (gdb)exec(-file) test2 2.断点的设立: (gdb)b(reakpoints) <rowNums...> <rowNums...>代

huqinwei的专栏 4万+
上一篇: ARP详解
milletluo
博客等级 码龄18年 239粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值