安云网 - AnYun.ORG | 专注于网络信息收集、网络数据分享、网络安全研究、网络各种猎奇八卦。
当前位置: 安云网 > 技术关注 > 逆向工程 > Linux编程基础——GDB(查看数据)

Linux编程基础——GDB(查看数据)

时间:2015-05-05来源:未知 作者:安云网点击:
查看栈信息 当程序被停住了,首先要确认的就是程序是在哪儿被断住的。这个一般是通过查看调用栈信息来看的。在gdb中,查看调用栈的命令是 backtrace ,可以简写为 bt 。 (gdb) bt #0 pop () at stack.c:10 #1 0x080484a6 in main () at main.c:12 也可

查看栈信息

//安云网,anyun.org

当程序被停住了,首先要确认的就是程序是在哪儿被断住的。这个一般是通过查看调用栈信息来看的。在gdb中,查看调用栈的命令是backtrace,可以简写为bt//ANYUN.ORG

    (gdb) bt
    #0 pop () at stack.c:10
    #1 0x080484a6 in main () at main.c:12

//安云网,anyun.org

也可以通过info stack命令实现类似的功能(我更喜欢这个命令):

//安云网咨询系统

    (gdb) info stack
    #0 pop () at stack.c:10
    #1 0x080484a6 in main () at main.c:12

//内容来自安云网

查看源程序 //内容来自AnYun.ORG

当程序断住是,gdb会显示当前断点的位置:

//copyright AnYun.ORG

    Breakpoint 1, pop () at stack.c:10
    10 return stack[top--];

//ANYUN.ORG

可以用list命令来查看当前断点附近的程序的源代码: //ANYUN.ORG

    (gdb) list
    5 int top = -1;
    6
    7
    8 char pop(void)
    9 {
    10 return stack[top--];
    11 }
    12 //内容来自安云网
    13 void push(char c)
    14 {

//本文来自安云网

list命令后面还可以更一些参数,来显示更多功能: //copyright AnYun.ORG

  • <linenum>    行号。 //本文来自安云网

  • <+> [offset]    当前行号的正偏移量。

    //copyright AnYun.ORG

  • <-> [offset]     当前行号的负偏移量。 //本文来自安云网

  • <filename:linenum> 文件的中的行行。 //copyright AnYun.ORG

  • <function>             函数的代码 //安云网咨询系统

  • <filename:function>     文件中的函数。

    //本文来自安云网

  • <*address> 程序运行时的语句在内存中的地址。 //内容来自安云网

不过,就算有这些信息,查看代码仍然不大方便。现在新版的gdb都带一个tui的功能,可以通过focus命令开启,其主要界面如下: //内容来自安云网

//copyright AnYun.ORG

这个界面比起list来说方便多了,能高亮当前语句的执行位置,步进时也会跟着变化,有点使用Turbo C的感觉。

//安云网,anyun.org

不知道是不是由于focus比较新的缘故,貌似网上并没有多少文章介绍它,虽然它比较容易上手,但也有不少可以介绍的地方,限于篇幅我这里就不做更多的说明,感兴趣的朋友可以看下gdb的gui用法这篇文章。

//ANYUN.ORG

查看运行时数据 //本文来自安云网

gdb中查看变量的命令是print,一般用它的简写形式p。它的语法如下: //ANYUN.ORG

    print [</format>] <expr>

//内容来自安云网

其中参数expr可以是一个变量,也可以是表达式。format表示输出格式,例如,可以用/x来将结果按16进制输出。如下是几个基本的例子:

//内容来自安云网

    (gdb) p top
    $16 = 1
    (gdb) p &top
    $17 = (int *) 0x804a014 <top>
    (gdb) p 3+2*5
    $18 = 13
    (gdb) p /x 3+2*5
    $19 = 0xd

//copyright AnYun.ORG

format的取值范围有如下几种: //安云网咨询系统

  • x 按十六进制格式显示变量。 //copyright AnYun.ORG

  • d 按十进制格式显示变量。

    //内容来自AnYun.ORG

  • u 按十六进制格式显示无符号整型。 //ANYUN.ORG

  • o 按八进制格式显示变量。 //copyright AnYun.ORG

  • t 按二进制格式显示变量。

    //安云网,anyun.org

  • a 按十六进制格式显示变量。

    //安云网咨询系统

  • c 按字符格式显示变量。 //安云网,anyun.org

  • f 按浮点数格式显示变量。 //本文来自安云网

查看函数返回值

//内容来自安云网

查看函数返回值是在调试的过程中经常遇到的需求。例如,对于如下函数

//内容来自AnYun.ORG

    int foo()
    {
        return 100;
    }
//安云网咨询系统

我们可以以如下方式获取函数的返回值:

//ANYUN.ORG

1. 通过finish命令运行至函数结束,此时会打印函数返回值。

//安云网咨询系统

    (gdb) finish
    Run till exit from #0 foo () at main.c:9
    main () at main.c:15
    15 }
    Value returned is $2 = 100
//ANYUN.ORG

2. 返回值会存储在eax寄存器中,通过查看信息可以获取返回值。

//内容来自AnYun.ORG

    (gdb) p $eax
    $3 = 100

    (gdb) info registers 
    eax 0x64 100

//安云网咨询系统

查看连续内存 //本文来自安云网

可以使用GDB的"@"操作符查看连续内存,"@"的左边是第一个内存的地址的值,"@"的右边则你你想查看内存的长度。 //安云网咨询系统

例如,对于如下代码:int arr[] = {2, 4, 6, 8, 10};,可以通过如下命令查看arr前三个单元的数据。 //本文来自安云网

    (gdb) p [email protected]
    $2 = {2, 4, 6}

//本文来自安云网

查看内存

//ANYUN.ORG

可以使用examine命令(简写为x)来查看内存地址中的值。x命令的语法如下所示: //安云网咨询系统

    x /<n/f/u> <addr> //内容来自AnYun.ORG

  • n 表示显示内存的长度,也就是说从当前地址向后显示几个地址的内容。 //copyright AnYun.ORG

  • f 表示显示的格式,如果是字符串,则用s,如果是数字,则可以用i。 //内容来自AnYun.ORG

  • u 表示从当前地址往后请求的字节数,默认是4个bytes。(b单字节,h双字节,w四字节,g八字节)

    //copyright AnYun.ORG

  • <addr> 表示一个内存地址。

    //内容来自安云网

例如:以两字节为单位显示前面的那个数组的地址后32字节内存信息如下. //安云网,anyun.org

    (gdb) x /16uh arr
    0xbffff4cc: 2 0 4 0 6 0 8 0
    0xbffff4dc: 10 0 34032 2052 0 0 0 0
//安云网,anyun.org

自动显示

//内容来自AnYun.ORG

在VisualStudio中,可以通过监视窗口动态查看变量的值。在gdb中,也提供了类似的命令display,它的语法是: //安云网,anyun.org

    display <expr>
    display /<fmt> <expr>
    display /<fmt> <addr>
//内容来自安云网

expr是一个表达式,fmt表示显示的格式,addr表示内存地址。当你用display设定好了一个或多个表达式后,只要你的程序被停下来(单步跟踪时),GDB会自动显示你所设置的这些表达式的值。

//安云网咨询系统

几个相关的命令如下:

//内容来自安云网

  • undisplay <dnums...>        不显示dispaly //copyright AnYun.ORG

  • delete display [dnums]    删除自动显示,不带dnums参数则删除所有自动显示,也支持范围删除,如: delete display 1,3-5 //安云网咨询系统

  • disable display <dnums...>    使display失效

    //ANYUN.ORG

  • enable display <dnums...>    恢复display

    //安云网咨询系统

  • info display        查看display信息

    //本文来自安云网


//本文来自安云网

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
验证码: 点击我更换图片
相关内容
推荐内容