gdb调试基本技巧(代码片段)

mrlayfolk mrlayfolk     2022-12-14     772

关键词:

1  说明

本文主要介绍一些简单的、常用的gdb调试技巧。

环境:GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)

参考文档:《gdb调试技巧》  作者不详

2  测试代码

技术图片
 1 #include <stdio.h>
 2 
 3 int test_func2(void) 
 4 
 5     int a = 1; 
 6     int b = 2; 
 7 
 8     return a + b;
 9 
10 
11 void test_func1(int flag)
12 
13     int a[] = 0x12, 0x23, 0x43, 0x78;
14     int b = 12;
15     int i = 0;
16     
17     if (flag == 0) 
18         return;
19     
20 
21     for (i = 0; i < sizeof(a)/sizeof(int); i++) 
22         a[i] += b;
23     
24     
25     for (i = 0; i < sizeof(a)/sizeof(int); i++) 
26         printf("%d	", a[i]);
27     
28     
29     printf("
");
30     
31     test_func2();
32 
33 
34 
35 
36 
37 int main(void)
38 
39     test_func1(1);
40 
41     test_func2();
42 
43     return 0;
44 
View Code

下面调试过程中的代码就是以上代码。

编译:gcc -g test_gdb.c  (注:必须加上-g参数,表示在文件中加入调试信息)

3  调试步骤

  • 与断点相关

加入一个断点

(gdb) b test_func1

(gdb) break test_func2

注:两种方式是等价的,一般简写为b

加入一个断点并设置进入条件

(gdb) b test_func1 if flag == 1

显示断点信息

(gdb) info b

(gdb) info breakpoints

失能一个断点

(gdb) disable b 2

注:disable了的停止点,GDB不会删除,需要时,enable即可。

使能一个断点

(gdb) enable b 2

删除一个断点

(gdb) delete break 2 

技术图片

  • 运行与查看

运行程序

run或r

列出源代码

list或l

单步调试

next或n

单步跟踪,进入函数

step或s

在指定行停住

(gdb) b 25

继续运行

continue或c

技术图片 

  • 查看运行时的数据

查看某一变量值

(gdb) print b

(gdb) print a[0]

查看静态数组

(gdb) print /x a

注:/x表示以十六进制显示

查看动态数组

(gdb) print /x *a@4

注:@的左边是数组的首地址的值,也就是变量array所指向的内容,右边则是数据的长度

查看内存

(gdb) x/4xh a

语法格式:x/<n/f/u> <addr>

n、f、u是可选的参数。

n是一个正整数,表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。

f 表示显示的格式,参见上面。如果地址所指的是字符串,那么格式可以是s,如果地址是指令地址,那么格式可以是i。

u 表示从当前地址往后请求的字节数,u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字节,g表示八字节。

gdb数据显示格式:

x

按十六进制格式显示变量

d

按十进制格式显示变量

u

按十六进制格式显示无符号整型

o

按八进制格式显示变量

t

按二进制格式显示变量

a

按十六进制格式显示变量

c

按字符格式显示变量

f

按浮点数格式显示变量

 技术图片

查看数组a的内存的四个地址以十六进制显示,每个地址请求4个字节(因为数组成员定义为int):

技术图片 

  • 退出

直接使用quit命令就可退出调试。

使用gdb+gdbserver调试应用程序(代码片段)

...b基本使用1.启动gdb2.gdb交互式命令二、gdb+gdbserver实现远程调试一、gdb基本使用?GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。对于一名Linux下工作的c++程序员,gdb是必不可少的... 查看详情

gdb调试技巧找到php执行进程当前执行的代码(代码片段)

假设线上有一段php脚本,突然在某天出问题了,不处理但是进程没有退出。这种情况可能是异常休眠或者是有段死循环代码,但是我们怎么定位呢,我们这个时候最想知道的应该是这个脚本在此刻在做什么吧。这个是gdb+zbacktrace... 查看详情

[linux高并发服务器]gdb调试(代码片段)

[Linux高并发服务器]GDB调试[Linux高并发服务器]GDB调试[Linux高并发服务器]GDB调试GDB是什么预先准备基本命令例子进入和退出gdb获取帮助查看文件代码查看和设置显示行数打断点!!!运行GDB程序GDB是什么GDB是由GNU软件系... 查看详情

从实践到原理掌握gdb(代码片段)

...目录基本概念什么是GDB?GDB可以用来做些什么?调试模型本地调试远程调试安装GDB实战启动调试调试未运行的程序无参数有参数调试运行中的程序已生成调试信息未生成调试信息调试core文件配置core文件生成调试core文件... 查看详情

从实践到原理掌握gdb(代码片段)

...目录基本概念什么是GDB?GDB可以用来做些什么?调试模型本地调试远程调试安装GDB实战启动调试调试未运行的程序无参数有参数调试运行中的程序已生成调试信息未生成调试信息调试core文件配置core文件生成调试core文件... 查看详情

调试利器gdb-下(代码片段)

调试利器GDB-下函数调用栈的查看(backtrace和frame)(在你阅读开源代码的时候或许这很有帮助)backtrace查看函数调用的顺序(函数)frameN切换到栈编号为N的上下文中infoframe查看当前函数调用的栈帧的信息... 查看详情

从实践到原理掌握gdb(代码片段)

...目录基本概念什么是GDB?GDB可以用来做些什么?调试模型本地调试远程调试安装GDB实战启动调试调试未运行的程序无参数有参数调试运行中的程序已生成调试信息未生成调试信息调试core文件配置core文件生成调试core文件... 查看详情

比gdb更方便的代码调试工具:cgdb(代码片段)

文章目录有bug的示例代码GDB调试操作CGDB调试操作别人的经验,我们的阶梯!CGDB是GDB的前端,在终端窗口中意图形化的形式来调试代码(基于ncurse),非常方便。相对于GDB来说,可以很大的提高效率。这篇文章就... 查看详情

比gdb更方便的代码调试工具:cgdb(代码片段)

文章目录有bug的示例代码GDB调试操作CGDB调试操作别人的经验,我们的阶梯!CGDB是GDB的前端,在终端窗口中意图形化的形式来调试代码(基于ncurse),非常方便。相对于GDB来说,可以很大的提高效率。这篇文章就... 查看详情

gdb动态调试攻防世界simple-check-100(代码片段)

文章目录题目IDA静态分析gdb动态调试gdb基本使用gdbpeda插件函数校验绕过总结题目攻防世界Reverse高手区题目链接simple-check-100,如下:解压缩得到三个文件:三个文件依次是一个32位elf,一个64位elf和一个32位exe。ELF... 查看详情

代码调试工具gdb(代码片段)

代码调试工具GDB入门什么是调试?关于GDB将代码载入GDB附录:源码编译cpp调试模式的编译golang调试模式的编译什么是调试?让代码一步一步慢慢执行,跟踪程序的运行过程。比如,可以让程序停在某个地方ÿ... 查看详情

linuxgdb调试工具应用详解(代码片段)

文章目录gdb调试工具gdb介绍生成调试信息启动gdb显示源代码设置断点简单断点—当前文件多文件设置断点---其他文件查询所有断点条件断点维护断点调试代码查看变量的值查看运行时变量的值自动显示变量的值查看修改变量的值... 查看详情

linuxgdb调试工具应用详解(代码片段)

文章目录gdb调试工具gdb介绍生成调试信息启动gdb显示源代码设置断点简单断点—当前文件多文件设置断点---其他文件查询所有断点条件断点维护断点调试代码查看变量的值查看运行时变量的值自动显示变量的值查看修改变量的值... 查看详情

gdb调试实战(10)多线程调试(代码片段)

使用gdb调试多线程时,和调试单线程时类似,但是需要附加使用几个命令来协助进行线程切换。a-首先是使用infothreads查看当前有哪些线程,当前所在线程。b-然后使用threadsid切换到其它线程。c-最后用threadapplyid|allcommand来把命令... 查看详情

c语言调试小技巧(代码片段)

经常看到有人介绍一些IDE或者像gdb这样的调试器的很高级的调试功能,也听人说过有些牛人做工程的时候就用printf来调试,不用特殊的调试器。特别是在代码经过编译器一些比较复杂的优化后,会变得“难以辨认”,使用调试器... 查看详情

用gdb调试程序(代码片段)

...明从CSDN的网站上找到的GDB使用说明。原文标题:用GDB调试程序作者:haoel(QQ:753640,MSN:haoel@hotmail.com)关键字:gdb调试cc++gun这篇文章非常好,所以转载了下来,作为收藏。GDB概... 查看详情

gdb调试实战给程序传递启动参数(代码片段)

有时候,我们的调试程序需要从命令行接受输入参数,我们来看下gdb如何给调试程序传递启动参数。可以在gdb启动时,通过选项指定被调试程序的参数,例如:$gdb-args./a.outabc也可以在gdb中,通过命令来设... 查看详情

用gdb调试程序(代码片段)

...明从CSDN的网站上找到的GDB使用说明。原文标题:用GDB调试程序作者:haoel(QQ:753640,MSN:haoel@hotmail.com)关键字:gdb调试cc++gun这篇文章非常好,所以转载了下来,作为收藏。GDB概... 查看详情