为了方便起见,我想在GDB中定义一些辅助marcos,其中一个就是offsetof()
宏.
我试过了
define offsetof
if $argc == 2
(int)(&((($arg0 *)0)->$arg1))
end
end
Run Code Online (Sandbox Code Playgroud)
它不工作:1类不如struct node
将分裂成Struct
和node
,所以$arg0 = Struct
,$arg1 = node
.2.我不确定gdb的命令是否可以返回值.
任何人都可以帮我一把吗?
Tom*_*mey 10
offsetof
我认为最好将其定义为函数,而不是定义为命令.这样你就可以在表达式中使用它; 如果您只想查看偏移量,您可以随时使用print
.
有两种方法可以定义offsetof
为函数.
如果您正在调试C或C++,您只需将其定义为宏:
(gdb) macro define offsetof(t, f) &((t *) 0)->f
Run Code Online (Sandbox Code Playgroud)
所以给出:
struct x {
int a;
long b;
};
Run Code Online (Sandbox Code Playgroud)
在我的机器上,我得到:
(gdb) p offsetof(struct x, a)
$1 = (int *) 0x0
(gdb) p offsetof(struct x, b)
$2 = (long *) 0x8
Run Code Online (Sandbox Code Playgroud)
上面"C或C++"限制的原因是其他语言不通过gdb的内置预处理器运行它们的表达式.
如果你想让它在其他语言中工作,那么答案是在Python中编写一个新的便利函数.这涉及更多,但请参阅gdb文档gdb.Function
.