博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单使用GDB
阅读量:5922 次
发布时间:2019-06-19

本文共 1771 字,大约阅读时间需要 5 分钟。

不多讲,用printf的方式真的很让人崩溃啊。。。尤其是刚开始就连一句printf的没添加过的,你更是伤不起。。。

初次使用,更高级功能慢慢挖掘。

 

首先,要在编译的时候加上-g开关,我这里用的

gcc 
-
g update0803.c 
-
o update

如果不加-g开关,用GDB打开文件的时候会提示找不到symbol。

然后就可以开始找哪一句出现segment fault了...

1、用gdb打开需调试的可执行文件,或者用 file 指定包含 symbol 的二进制文件

gdb update

2、对照自己的code,要在哪一行添加 breakpoint。比如,我需要在217行家break。

break
 
217 or b 217

另,断点可以用行号,也可以用函数的名字。暂时知道这两种方法。

此外,可以使info b 来查看设置了哪些断点。还可以delete 编号 来删除断点

可以用 list(缩写 l )来查看源文件内容

。。。。加上所有你想加的break,go on

run

如果你的程序已经在 run 了——比如远程调试,gdbserver 已经在 run 程序了,那么,继续执行,就需要用 continue( 缩写 c )。

3、到达断点之后,单步调试step,或者简写的s

step or s

单步调试也可以用next(简写n)。与step不同的是,step是单步,next是下一行;next的下一行是指代码里的下一行,并不进如函数

另外,stepi,nexti是这两个命令的扩展,i表示一次运行的行数,比如,要一次运行下面5行,就直接step5

4、到达指定的断点要干什么呢?当然是要看变量的值,观察变量的值,用print,简写做p。比如,我要打印struct filelist下的filename字符串。

p flielist-
>
filename

5、我们只是观察循环了的某条语句,不可能把循环里的每条语句都step一遍吧?所以,很快走完下一个循环的命令就是continue,简写作c

6、退出用命令quit,简写作q

7、重新载入文件,用file xxxx,xxxx就是你要调试的可执行文件名字,比如,我把上面的update又重新编译了一遍,然后重新载入

file update

 

然后,又设断点,运行,查看。。。今天先初步接触,总比一句句添加printf强。

 

补充:

当我们的二进制文件是由多个文件编译而来。那么,我们设置断点的时候,在行之前,指定文件名即可,比如,在 mainobject.cpp 的第 7 行设置断点:

br mainobject.cpp:7

同样,我们不确定到底在多少行时,可以用先用 list 来查看一下:

l  mainobject.cpp:7

小技巧,执行 list 时,可以直接按 enter,来接着查看接下来的行。

 

补充2:

gdb 中,还可以使用 disassamble 来查看汇编代码,并设置断点,如下:

[root@test opt]# gcc test.c -o ./static -static[root@test opt]# gdb ./static(gdb) disassemble main0x08048204 
: push %ebp0x08048205
: mov %esp,%ebp0x08048207
: sub $0x8,%esp0x0804820a
: and $0xfffffff0,%esp0x0804820d
: mov $0x0,%eax0x08048212
: sub %eax,%esp0x08048214
: call 0x804cb20 <__getuid>0x08048219
: leave0x0804821a
: ret
(gdb) b *0x08048207

上面是在二进制 0x08048207 位置,设置了断点。

转载地址:http://vvivx.baihongyu.com/

你可能感兴趣的文章
Python3字典中items()和python2.x中iteritems()有什么区别
查看>>
Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(二)
查看>>
框架升级后某个类型所在程序集发生转移,应用还能正常运行吗?
查看>>
Ubuntu 16.04服务器安装及软件配置
查看>>
开头不讲"Hello Word",读尽诗书也枉然 : Word 操作组件介绍 - Spire.Doc (转)
查看>>
Differential Geometry之第三章曲面的局部理论
查看>>
【GoLang】golang中 channel 实现同步 与mutex/atomic 实现同步的讨论
查看>>
转: Git远程操作详解 (阮一峰)
查看>>
Maven生命周期
查看>>
105个软件测试工具大放送
查看>>
Docker探索系列2之镜像打包与DockerFile
查看>>
treegrid and datagrid ctrl or shift selectRow
查看>>
[转]CentOS 6.4下PXE+Kickstart无人值守安装操作系统
查看>>
分布式与集群的联系与区别
查看>>
不重新编译php安装配置eAccelerator
查看>>
_beginthreadex注意事项
查看>>
xcode 打包
查看>>
消息队列库——ZeroMQ
查看>>
android 物理按键 监听
查看>>
python 批量重命名
查看>>