`

gdb用法(一)基本 gdb 命令

阅读更多

GDB 概述
GDB是GNU开源组织发布的一个强大的UNIX下的程式调试工具。或许,各位比较喜欢那种图像界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图像化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。
一般来说,GDB主要帮忙你完成下面四个方面的功能:
1、启动你的程式,能按照你的自定义的需求随心所欲的运行程式。
2、可让被调试的程式在你所指定的调置的断点处停住。(断点能是条件表达式)
3、当程式被停住时,能检查此时你的程式中所发生的事。
4、动态的改动你程式的执行环境。

使用GDB

一般来说GDB主要调试的是C/C++的程式。要调试C/C++的程式,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数能做到这一点。如:
> gcc -g hello.c -o hello
> g++ -g hello.cpp -o hello
如果没有-g,你将看不见程式的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看怎么用gdb来调试他。

启动GDB的方法有以下几种:
1、gdb program
program 也就是你的执行文件,一般在当前目录下。
2、gdb program core
用gdb同时调试一个运行程式和core文件,core是程式非法执行后core dump后产生的文件。
3、gdb program 1234
如果你的程式是个服务程式,那么你能指定这个服务程式运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

基本 gdb 命令.

命 令 描 述
file 装入想要调试的可执行文件.
kill 终止正在调试的程序.
list 列出产生执行文件的源代码的一部分.
next 执行一行源代码但不进入函数内部.
step 执行一行源代码而且进入函数内部.
run 执行当前被调试的程序
quit 终止 gdb
watch 使你能监视一个变量的值而不管它何时被改变.
break 在代码里设置断点, 这将使程序执行到这里时被挂起.
make 使你能不退出 gdb 就可以重新产生可执行文件.
shell 使你能不离开 gdb 就执行 UNIX shell 命令.

利用print 命令可以检查各个变量的值。

whatis 命令可以显示某个变量的类型

从断点继续运行:countinue 命令

显示当前gdb的断点信息: info break

删除指定的某个断点: delete breakpoint 1

禁止使用某个断点 disable breakpoint 1

允许使用某个断点 enable breakpoint 1

gdb调试程序的方法

1)进入gdb调试:
 gdb + 已经编译通过的可执行程序 -》 就进入调试模式。例如:gdb MiddlePublisher
2)r + 运行时的参数 -》 开始运行可执行程序。例如 r -lxml2 -f refile
3)b + 断点 -》设置调试的断点。两种:一种是:b CMSTask.cpp:200 表示在CMSTask.cpp文件的第200行设置断点

另一种:b TaskManager::buildPubWinTask 表示在执行buildPubWinTask这个函数的时候停止。
4)取消断点:
  dis 1 表示取消第一个断点
  dis 2 表示取消第二个断点
5)查看设置断点信息: info b
6)在断点停止处查看所在代码的详细信息:l
7)可以在gdb中直接编译,然后再重新运行时,gdb会直接执行新编译好的可执行程序。例如:直接在gdb下执行make后再重庆运行。
8)跟进一个函数:s
  如果设置的断点是在一个函数入口。到达该断点时,键入s就可以进入该函数内部进行调试。如果有多个函数就多次键入S来进入内部的函数。


小结:常用的gdb命令
backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)
breakpoint 在程序中设置一个断点
cd 改变当前工作目录
clear 删除刚才停止处的断点
commands 命中断点时,列出将要执行的命令
continue 从断点开始继续执行
delete 删除一个断点或监测点;也可与其他命令一起使用
display 程序停止时显示变量和表达时
down 下移栈帧,使得另一个函数成为当前函数
frame 选择下一条continue命令的帧
info 显示与该程序有关的各种信息
jump 在源程序中的另一点开始运行
kill 异常终止在gdb 控制下运行的程序
list 列出相应于正在执行的程序的原文件内容
next 执行下一个源程序行,从而执行其整体中的一个函数
print 显示变量或表达式的值
pwd 显示当前工作目录
pype 显示一个数据结构(如一个结构或C++类)的内容
quit 退出gdb
reverse-search 在源文件中反向搜索正规表达式
run 执行该程序
search 在源文件中搜索正规表达式
set variable 给变量赋值
signal 将一个信号发送到正在运行的进程
step 执行下一个源程序行,必要时进入下一个函数
undisplay display命令的反命令,不要显示表达式
until 结束当前循环
up 上移栈帧,使另一函数成为当前函数
watch 在程序中设置一个监测点(即数据断点)
whatis 显示变量或函数类型

break NUM 在指定的行上设置断点。
bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。
clear 删除设置在特定源文件、特定行上的断点。其用法为clear FILENAME:NUM
continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而 导致停止运行时。
display EXPR 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。
file FILE 装载指定的可执行文件进行调试。
help NAME 显示指定命令的帮助信息。
info break 显示当前断点清单,包括到达断点处的次数等。
info files 显示被调试文件的详细信息。
info func 显示所有的函数名称。
info local 显示当函数中的局部变量信息。
info prog 显示被调试程序的执行状态。
info var 显示所有的全局和静态变量名称。
kill 终止正被调试的程序。
list 显示源代码段。
make 在不退出 gdb 的情况下运行 make 工具。
next 在不单步执行进入其他函数的情况下,向前执行一行源代码。
print EXPR 显示表达式 EXPR 的值。

数组

有时候,你需要查看一段连续的内存空间的值。比如数组的一段,或是动态分配的数据的大小。你可以使用 GDB “ @ ” 操作符, “ @ ” 的左边是第一个内存的地址的值, “ @ ” 的右边则你你想查看内存的长度。例如,你的程序中有这样的语句:

int *array = (int *) malloc (len * sizeof (int));

于是,在 GDB 调试过程中,你可以以如下命令显示出这个动态数组的取值:

p *array@len

@ 的左边是数组的首地址的值,也就是变量 array 所指向的内容,右边则是数据的长度,其保存在变量 len 中,其输出结果,大约是下面这个样子的:

(gdb) p *array@len
$1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40}

如果是静态数组的话,可以直接用 print 数组名,就可以显示数组中所有数据的内容了。


查看栈信息
—————

当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入 Stack )中。你可以用 GDB 命令来查看当前的栈中的信息。

下面是一些查看函数调用栈信息的 GDB 命令:

backtrace
bt
打印当前的函数调用栈的所有信息。如:

(gdb) bt
#0 func (n=250) at tst.c:6
#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6

从上可以看出函数的调用栈信息: __libc_start_main --> main() --> func()


backtrace <n>
bt <n>
n
是一个正整数,表示只打印栈顶上 n 层的栈信息。

backtrace <-n>
bt <-n>
-n
表一个负整数,表示只打印栈底下 n 层的栈信息。

如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。

frame <n>
f <n>
n
是一个从 0 开始的整数,是栈中的层编号。比如: frame 0 ,表示栈顶, frame 1 ,表示栈的第二层。

up <n>
表示向栈的上面移动 n 层,可以不打 n ,表示向上移动一层。

down <n>
表示向栈的下面移动 n 层,可以不打 n ,表示向下移动一层。

上面的命令,都会打印出移动到的栈层的信息。如果你不想让其打出信息。你可以使用这三个命令:

select-frame <n>
对应于 frame 命令。
up-silently <n>
对应于 up 命令。
down-silently <n>
对应于 down 命令。


查看当前栈层的信息,你可以用以下 GDB 命令:

frame f
会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。

info frame
info f
这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。如:
(gdb) info f
Stack level 0, frame at 0xbffff5d4:
eip = 0x804845d in func (tst.c:6); saved eip 0x8048524
called by frame at 0xbffff60c
source language c.
Arglist at 0xbffff5d4, args: n=250
Locals at 0xbffff5d4, Previous frame's sp is 0x0
Saved registers:
ebp at 0xbffff5d4, eip at 0xbffff5d8

info args
打印出当前函数的参数名及其值。

info locals
打印出当前函数中所有局部变量及其值。

info catch
打印出当前的函数中的异常处理信息。


恢复程序运行和单步调试

当程序被停住了,你可以用 continue 命令恢复程序的运行直到程序结束,或下一个断点到来。也可以使用 step next 命令单步跟踪程序。

continue [ignore-count]
c [ignore-count]
fg [ignore-count]
恢复程序运行,直到程序结束,或是下一个断点到来。 ignore-count 表示忽略其后的断点次数。 continue c fg 三个命令都是一样的意思。


step <count>
单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有 debug 信息。很像 VC 等工具中的 step in 。后面可以加 count 也可以不加,不加表示一条条地执行,加表示执行后面的 count 条指令,然后再停住。

next <count>
同样单步跟踪,如果有函数调用,他不会进入该函数。很像 VC 等工具中的 step over 。后面可以加 count 也可以不加,不加表示一条条地执行,加表示执行后面的 count 条指令,然后再停住。

set step-mode
set step-mode on
打开 step-mode 模式,于是,在进行单步跟踪时,程序不会因为没有 debug 信息而不停住。这个参数有很利于查看机器码。

set step-mod off
关闭 step-mode 模式。

finish
运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。

until u
当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。

stepi si
nexti
ni
单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成, stepi nexti 可以单步执行机器指令。与之一样有相同功能的命令是 “ display/i $pc ” ,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)


设置观察点( WatchPoint

观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:

watch <expr>
为表达式(变量) expr 设置一个观察点。一量表达式值有变化时,马上停住程序。

rwatch <expr>
当表达式(变量) expr 被读时,停住程序。

awatch <expr>
当表达式(变量)的值被读或被写时,停住程序。

info watchpoints
列出当前所设置了的所有观察点。

分享到:
评论

相关推荐

    gdb命令详解.pdf

    gdb命令详解 简单扼要地使用找一张命令表记录了gdb的相关调试命令,及其详细用法,对查阅gdb调试命令带来非常了方便!

    GDB 命令说明 GDB命令归纳

    自己归纳总结的GDB调测命令(共整理了约140多个命令使用方法),掌握这些指令,基本上对程序的调试可以达到得心应心了,原创的资料,希望给大家带来帮助!

    gdb调试命令用法.txt

    Linux gdb调试命令

    gdb调试器的用法-常用命令

    描述了 linux下 gdb 调试 常用的命令

    gdb调试器命令学习总结笔记

    简单总结了gdb调试的一些方法

    gdb调试常用命令总结

    gdb调试常用命令总结,包括单步调试,断点添加,跟踪调试等。

    linux的C++程序gdb调试方法

    使用gdb命令后跟上你想要调试的程序名来启动GDB。例如: bash gdb myprogram 设置断点 在程序的特定位置设置断点,这样当程序运行到这些位置时,GDB会暂停执行。你可以使用break或b命令来设置断点。例如,如果你想...

    参考资料—GDB的基本调试命令用法1

    1、启动程序,可以按照程序员自定义的要求随心所欲的运行程序 2、可让被调试的程序在所指定的断点处停住 3、当程序被停住时,可以通过 dump 文件来检查此时程序

    linux使用gdb调试方法详解

    linux使用gdb调试方法详解,包含 GDB 命令、在 GDB 里运行程序的例子,如何打断点和继续运行、查看堆栈信息、检查源文件,查看内存信息和各种数据

    GDB使用手册,详尽的命令用法

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的...

    GDB 全集详细解释

    详细介绍GDB调试命令的使用,以及调试的方法

    GDB使用手册.CHM

    用于在Linux下调试C语言,C++等程序....GDB的使用方法 GDB中运行UNIX的shell程序 查看运行时数据 处理源程序 调试已运行的程序 改变程序的执行 用GDB调试程序示例 解说详细,来源于网络,经过本人细心整理.

    gdb使用手册.doc

    详细介绍gdb的使用,并有例子,帮助更好的理解掌握调试手段,让你在调试过程中畅通无阻,只是罗列了一些带用的GDB的命令和使用方法

    gdb 调试手册 命令

    gdb 调试手册 命令 和学习 使用方法

    GDB 使用详解

    详细说明了 gdb 调试中的各个命令以及使用方法

    gdb command

    gdb,命令详解,包括gdb常用的命令,介绍,使用方法,比较详细

    GDB调试精粹及使用实例

    本文档用于的unix下GDB调试,文中包含简单的gdb调试命令使用方法,并提供了用例

    gdb调试费方法详解[含例子]

    gdb调试费方法详解[含例子],包含gdb所有常用的调试命令使用及例题,适合学习和巩固gdb调试

    GDB的详细用法手册

    软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可 以做出一个非常强大的功能。 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成 更为强劲的功能...

    debug with GDB

    GDB完全手册,介绍一些GDB的基本命令和使用方法,供参考。

Global site tag (gtag.js) - Google Analytics