我有以下 C++ 代码:
main.cpp:
#include "a.h"
int main(){
int x[3];
some_macro(x)
// comment
// comment
return x[2];
}
a.h:
template <typename T>
inline void some_macro_break_point()
{
}
#define some_macro(name) \
{ \
some_macro_break_point(); \
}
并使用 GDB python 扩展,我试图获取使用 GDB 时调用宏的行和文件,因为我在 some_macro_break_point 上有一个自动断点
遇到断点时我会执行以下操作:
frame = gdb.newest_frame()
frame = frame.older()
pc = frame.pc()
symtab_line = gdb.find_pc_line(pc)
print(">>>> ", symtab_line.symtab.fullname() + ":" + str(symtab_line.line), "<<<<\n")
如果我在主宏调用下有注释,我会得到 +
如何正确检测在 main 中调用宏的确切行?当我没有注释时,我会得到偏移量为 1 的行。
我尝试获取 gdb 框架的符号表,但值受到宏调用下有注释这一事实的影响。
ssbssa> 尝试从 pc 中减去 1,例如 pc = frame.pc() - 1 Ruba Rushrush> 从电脑中减去 1 成功了!但这里的逻辑是什么?
逻辑是:当断点触发时,堆栈上的帧是
some_macro_break_point
,frame.older().pc()
指向main
中some_macro_break_point()
将返回的位置。
该位置是 main
调用
some_macro_break_point()
的位置 after,即它是下一个可执行行。
如果您
disas/s main
并打印 frame.older().pc()
,这一切都会变得更加清晰。