我们可以在GDB会话中定义新的数据类型吗? [英] Can we define a new data type in a GDB session
问题描述
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>
#includesample.h
int main()
{
struct sample sm;
sm.i = 42;
sm.less = sm.more =& sm;
printf(& sm =%p\\\
,& sm);
assert(sm.i == 0); //会失败
}
gcc main.c#注意:没有'-g'标志
gdb -q ./a.out
(gdb)运行
& sm = 0x7fffffffd6b0
a.out:main.c:11:main:断言`sm.i == 0'失败。
编程接收到的信号SIGABRT,中止。
0x00007ffff7a8da75 in $($)
(gdb)fr 3
#3 0x00000000004005cc in main()
没有局部变量,没有类型 struct sample
:
(gdb)p sm
当前上下文中没有符号sm。
(gdb)p(struct sample *)0x7fffffffd6b0
没有名为sample的结构类型。
所以我们开始工作:
// sample.c
#includesample.h
struct sample foo;
gcc -g -c sample.c
(gdb)add-symbol-file sample.o 0
从文件sample.o中添加符号表在
.text_addr = 0x0
$ b(gdb)p(struct sample *)0x7fffffffd6b0
$ 1 =(struct sample *)0x7fffffffd6b0
(gdb)p * $ 1
$ 2 = {i = 42,less = 0x7fffffffd6b0,more = 0x7fffffffd6b0}
Voilà! / p>
Is there a way to define a new data type (C structure or union) in gdb. The idea is to define a structure and then make gdb print data from an address interpreted as the newly defined structure.
For example, lets say we have a sample structure.
struct sample {
int i;
struct sample *less;
struct sample *more;
}
And if 0x804b320 is the address of an array of struct sample
. The binary doesn't have debugging information so that gdb understands struct sample
. Is there any way to define struct sample
in a gdb session? So that we can print p *(struct sample *)0x804b320
Yes, here is how to make this work:
// 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 ()
No local variables, no type struct sample
:
(gdb) p sm
No symbol "sm" in current context.
(gdb) p (struct sample *)0x7fffffffd6b0
No struct type named sample.
So we get to work:
// 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à!
这篇关于我们可以在GDB会话中定义新的数据类型吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!