七、八年前写过一篇《 用GDB调试程序》,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB的问题,一直到今天,还有人在问GDB的相关问题。这么多年来,有一些问题是大家反复在问的,一方面,我觉得我以前的文章可能没有说清楚,另一方面,我觉得大家常问的问题正是最有用的,所以,在这里罗列出来。希望大家补充。

一、多线程调试

多线程调试可能是问得最多的。其实,重要就是下面几个命令:

  • info thread 查看当前进程的线程。
  • thread <ID> 切换调试的线程为指定ID的线程。
  • break file.c:100 thread all  在file.c文件第100行处为所有经过这里的线程设置断点。
  • set scheduler-locking off|on|step,这个是问得最多的。在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,怎么只让被调试程序执行呢?通过这个命令就可以实现这个需求。
    • off 不锁定任何线程,也就是所有线程都执行,这是默认值。
    • on 只有当前被调试程序会执行。
    • step 在单步的时候,除了next过一个函数的情况(熟悉情况的人可能知道,这其实是一个设置断点然后continue的行为)以外,只有当前线程会执行。

二、调试宏

这个问题超多。在GDB下,我们无法print宏定义,因为宏是预编译的。但是我们还是有办法来调试宏,这个需要GCC的配合。

在GCC编译程序的时候,加上-ggdb3参数,这样,你就可以调试宏了。

另外,你可以使用下述的GDB的宏调试命令 来查看相关的宏。

  • info macro – 你可以查看这个宏在哪些文件里被引用了,以及宏定义是什么样的。
  • macro – 你可以查看宏展开的样子。

三、源文件

这个问题问的也是很多的,太多的朋友都说找不到源文件。在这里我想提醒大家做下面的检查:

  1. 编译程序员是否加上了-g参数以包含debug信息。
  2. 路径是否设置正确了。使用GDB的directory命令来设置源文件的目录。

下面给一个调试/bin/ls的示例(ubuntu下)


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

$
apt-get
source

coreutils

$
sudo

apt-get
install

coreutils-dbgsym

$
gdb
/bin/ls

GNU
gdb (GDB) 7.1-ubuntu

(gdb)
list main

1192   
ls.c:
No such
file

or directory.

in

ls
.c

(gdb)
directory ~
/src/coreutils-7.4/src/

Source
directories searched:
/home/hchen/src/coreutils-7.4:$cdir:$cwd

(gdb)
list main

1192       
}

1193   
}

1194

1195   
int

1196   
main (int argc, char **argv)

1197   
{

1198     
int i;

1199     
struct pending *thispend;

1200     
int n_files;

1201

四、条件断点

条件断点是语法是:break  [where] if [condition],这种断点真是非常管用。尤其是在一个循环或递归中,或是要监视某个变量。注意,这个设置是在GDB中的,只不过每经过那个断点时GDB会帮你检查一下条件是否满足。

五、命令行参数

有时候,我们需要调试的程序需要有命令行参数,很多朋友都不知道怎么设置调试的程序的命令行参数。其实,有两种方法:

  1. gdb命令行的 –args 参数
  2. gdb环境中 set args命令。

六、gdb的变量

有时候,在调试程序时,我们不单单只是查看运行时的变量,我们还可以直接设置程序中的变量,以模拟一些很难在测试中出现的情况,比较一些出错,或是switch的分支语句。使用set命令可以修改程序中的变量。

另外,你知道gdb中也可以有变量吗?就像shell一样,gdb中的变量以$开头,比如你想打印一个数组中的个个元素,你可以这样:


1

2

3

4

5

(gdb)
set

$i = 0

 

(gdb)
p a[$i++]

 

...
 
#然后就一路回车下去了

当然,这里只是给一个示例,表示程序的变量和gdb的变量是可以交互的。

七、x命令

也许,你很喜欢用p命令。所以,当你不知道变量名的时候,你可能会手足无措,因为p命令总是需要一个变量名的。x命令是用来查看内存的,在gdb中 “help x” 你可以查看其帮助。

  • x/x 以十六进制输出
  • x/d 以十进制输出
  • x/c 以单字符输出
  • x/i  反汇编 – 通常,我们会使用 x/10i $ip-20 来查看当前的汇编($ip是指令寄存器)
  • x/s 以字符串输出

八、command命令

有一些朋友问我如何自动化调试。这里向大家介绍command命令,简单的理解一下,其就是把一组gdb的命令打包,有点像字处理软件的“宏”。下面是一个示例:


1

2

3

4

5

6

7

8

9

10

(gdb)
break

func

Breakpoint
1 at 0x3475678:
file

test
.c,
line 12.

(gdb)
command

1

Type
commands
for

when breakpoint 1 is hit, one per line.

End
with a line saying just
"end".

>print
arg1

>print
arg2

>print
arg3

>end

(gdb)

当我们的断点到达时,自动执行command中的三个命令,把func的三个参数值打出来。

GDB中应该知道的几个调试方法相关推荐

  1. GDB中应该知道的几个调试方法-转

    七.八年前写过一篇<用GDB调试程序>,于是,从那以后,很多朋友在MSN上以及给我发邮件询问我关于GDB的问题,一直到今天,还有人在问GDB的相关问题.这么多年来,有一些问题是大家反复在问 ...

  2. vs2013中带命令行参数的调试方法

    @VS2013带命令行参数的调试方法 在C++函数参数传递中,我们知道,main函数是演示C++程序如何向函数传递数组的好例子.一般来说,我们定义的大多main函数都只有空的形参列表: int mai ...

  3. idea 断点线程_在IntelliJ IDEA中多线程并发代码的调试方法

    通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法.让你在多线程开发过程中的调试更加的有的放矢. 我们将通过一个例子来学习.在这里,我编写了一个多线程程 ...

  4. Linux平台Segmentation fault(段错误)调试方法

    1. 段错误是什么 一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址.访问了系统保护的内存地址.访问了只读的内存地址等等情况. 2. 段错误的原因 段错 ...

  5. Linux内核调试方法【转】

    转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...

  6. Windows 下常见的反调试方法

    稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口: IsDeb ...

  7. 【转贴】gdb中的信号(signal)相关调试技巧

    一篇不错的帖子,讲的是gdb中的信号(signal)相关调试技巧 转自Magic C++论坛  http://www.magicunix.com/index_ch.html  http://www.m ...

  8. linux问号符号,调试linux内核时gdb中的问号符号4.10

    我想从linux内核中的函数start_kernel()调试linux内核.调试linux内核时gdb中的问号符号4.10 这基本上就是我已经做了 从kernel.org 下载4.10内核源提取源后: ...

  9. gdb中的信号(signal)相关调试技巧

    一篇不错的帖子,讲的是gdb中的信号(signal)相关调试技巧 转自Magic C++论坛 http://www.magicunix.com/index_ch.html http://www.mag ...

最新文章

  1. ugui 转轮_Unity3D研究院之Android NDK编译C/C++结合Unity实现本地数据共享(二十八)...
  2. 白话Elasticsearch27-深度探秘搜索技术之误拼写时的fuzzy模糊搜索技术
  3. 跨工厂物料状态/特定工厂的物料状态
  4. LIVE555再学习 -- live555实现RTSP直播服务器 分析
  5. Python os模块文件操作(二)
  6. 10个问题让你快速避开java中的jdbc常见坑
  7. centos 6.2安装mysql_centos6.2安装mysql
  8. UVA10193 All You Need Is Love【进制+GCD】
  9. 【ROS学习笔记】(六)客户端Client的编程实现
  10. 创新声卡KX驱动安装、调试、使用教程
  11. HTML5 + Canvas + 广度优先搜索(BFS) 编写lol连连看
  12. android 两张电信_双卡双待双核2.3 电信机皇摩托XT882评测
  13. 初识MQ和RabbitMQ
  14. 常用Linux版本虚拟机的使用比较
  15. PhotoShop算法实现进阶-浮雕滤镜-灰度浮雕(三十一)
  16. 再见了,“阅兵村”!
  17. php运算符综合实例,php中三元运算符的嵌套实例
  18. 如何用u盘制作成linux系统的安装盘
  19. throttle在程序中的作用
  20. discuz7.2帖子管理

热门文章

  1. redis hash key mysql_Linux取得Redis数据库中hash类型的所有feild或者所有value
  2. java怎么导入文件_怎么将文件导入java
  3. orm mysql_ORM介绍
  4. java nio 读取图片_给大忙人们看的 Java NIO 极简教程
  5. 相对布局(RelativeLayout)
  6. 桌面计算机怎么覆盖文件,win7系统桌面快捷方式图标被未知文件覆盖如何解决...
  7. tensordot 的源码解读
  8. ROC曲线和 AUC值的计算
  9. python矩阵分解
  10. 居民信息管理系统java_基于jsp的社区住户信息管理系统-JavaEE实现社区住户信息管理系统 - java项目源码...