我们可以在GDB会话中定义新的数据类型吗
是否有一种方法可以在gdb中定义新的数据类型(C结构或联合)。其思想是定义一个结构,然后让gdb从一个被解释为新定义的结构的地址打印数据我们可以在GDB会话中定义新的数据类型吗,gdb,Gdb,是否有一种方法可以在gdb中定义新的数据类型(C结构或联合)。其思想是定义一个结构,然后让gdb从一个被解释为新定义的结构的地址打印数据 struct sample { int i; struct sample *less; struct sample *more; } 例如,假设我们有一个示例结构 struct sample { int i; struct sample *less; struct sample *more; } 如果0x804b320是struct
struct sample {
int i;
struct sample *less;
struct sample *more;
}
例如,假设我们有一个示例结构
struct sample {
int i;
struct sample *less;
struct sample *more;
}
如果0x804b320是
struct sample
数组的地址。二进制文件没有调试信息,因此gdb无法理解struct sample
。有没有办法在gdb会话中定义struct sample
?这样我们就可以打印p*(struct sample*)0x804b320
是的,下面是如何实现这一点的:
// 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 ()
所以我们开始工作:
// 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}
瞧