显示栈信息

当程序停在你设置的断点处时,你首先需要看的是函数调用的过程即函数调用栈,及每层栈中函数的名称、参数和局部变量等信息,这时可以用gdb提供的backtrace(bt)来查看函数调用栈信息

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

backtrace <-n> ,bt <-n> -n表一个负整数,表示只打印栈底下n层的栈信息。
   (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()

如果你要查看某一层的信息,你需要在切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈,此时可以用frame命令来进行切换

frame <n>   是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
up          表示向栈的上面移动n层,可以不打n,表示向上移动一层。

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

当切换到某个某层frame时,可以使用info命令来查看当前函数的具体信息

info frame  显示当前frame的详细信息
info args    显示函数的参数的详细信息
info locals     打印出当前函数中所有局部变量及其值
info catch      打印出当前的函数中的异常处理信息

显示源代码

GDB 可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g的参数,把源程序信息编译到执行文件中,具体可以使用list命令来查看源代码程序

list + 参数
一般来说在list后面可以跟以下这们的参数:
   行号。
    <+offset>   当前行号的正偏移量
    <-offset>   当前行号的负偏移量
     哪个文件的哪一行
     函数名
     哪个文件中的哪个函数
    <*address> 程序运行时的语句在内存中的地址

搜索源代码

GDB还提供了源代码搜索的命令:

forward-search ,search         向前面搜索。
reverse-search  全部搜索。

其中是正则表达式,也主一个字符串的匹配模式

用-g编译过后的执行程序中只是包括了源文件的名字,没有路径名。GDB提供了可以让你指定源文件的路径的命令,以便GDB进行搜索。

directory    加一个源文件路径到当前路径的前面
directory                      清除所有的自定义的源文件搜索路径信息
show directories            显示定义了的源文件搜索路径

使用info line命令来查看源代码在内存中的地址

(gdb) info line tst.c:func
        Line 5 of "tst.c" starts at address 0x8048456  and ends at 0x804845d .

disassemble命令可以查看当前程序的机器码即汇编指令

(gdb) disassemble func
        Dump of assembler code for function func:
        0x8048450 :       push   %ebp
        0x8048451 :     mov    %esp,%ebp
        0x8048453 :     sub    $0x18,%esp
        0x8048456 :     movl   $0x0,0xfffffffc(%ebp)
        0x804845d :    movl   $0x1,0xfffffff8(%ebp)
        0x8048464 :    mov    0xfffffff8(%ebp),%eax

下面一篇文章将介绍如何查看运行时的数据

来自yaronspace.cn  本文链接:http://yaronspace.cn/blog/archives/968