如何在GDB中定义offsetof()宏

Dou*_* Su 5 c debugging gdb

为了方便起见,我想在GDB中定义一些辅助marcos,其中一个就是offsetof()宏.

我试过了

define offsetof
    if $argc == 2
        (int)(&((($arg0 *)0)->$arg1))
    end
end
Run Code Online (Sandbox Code Playgroud)

它不工作:1类不如struct node将分裂成Structnode,所以$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.