2011-09-01 87 views
24

有没有办法在gdb中定义新的数据类型(C结构或联合)?这个想法是定义一个结构,然后从一个解释为新定义结构的地址创建gdb打印数据。我们可以在GDB会话中定义新的数据类型吗

例如,假设我们有一个样本结构。

struct sample { 
    int i; 
    struct sample *less; 
    struct sample *more; 
} 

并且如果0x804b320是struct sample的数组的地址。该二进制文件没有调试信息,因此gdb可以理解struct sample。有没有什么办法在gdb会话中定义struct sample?这样我们就可以打印p *(struct sample *)0x804b320

回答

38

是的,这里是如何使这项工作:

// sample.h 
struct sample { 
    int i; 
    struct sample *less; 
    struct sample *more; 
}; 

// main.c 
#include <stdio.h> 
#include <assert.h> 
#include "sample.h" 
int main() 
{ 
    struct sample sm; 
    sm.i = 42; 
    sm.less = sm.more = &sm; 

    printf("&sm = %p\n", &sm); 
    assert(sm.i == 0); // will fail 
} 

gcc main.c # Note: no '-g' flag 

gdb -q ./a.out 
(gdb) run 
&sm = 0x7fffffffd6b0 
a.out: main.c:11: main: Assertion `sm.i == 0' failed. 

Program received signal SIGABRT, Aborted. 
0x00007ffff7a8da75 in raise() 
(gdb) fr 3 
#3 0x00000000004005cc in main() 

没有局部变量,没有类型struct sample

(gdb) p sm 
No symbol "sm" in current context. 
(gdb) p (struct sample *)0x7fffffffd6b0 
No struct type named sample. 

所以我们开始工作:

// sample.c 
#include "sample.h" 
struct sample foo; 

gcc -g -c sample.c 

(gdb) add-symbol-file sample.o 0 
add symbol table from file "sample.o" at 
    .text_addr = 0x0 

(gdb) p (struct sample *)0x7fffffffd6b0 
$1 = (struct sample *) 0x7fffffffd6b0 
(gdb) p *$1 
$2 = {i = 42, less = 0x7fffffffd6b0, more = 0x7fffffffd6b0} 

Voilà!

+1

鬼鬼祟祟。我喜欢。 –

相关问题