python gdb 扩展:我正在尝试获取宏调用的调用行和文件信息,但由于注释而获取错误的值

问题描述 投票:0回答:1

我有以下 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 框架的符号表,但值受到宏调用下有注释这一事实的影响。

python c++ gdb gdb-python
1个回答
0
投票

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()
,这一切都会变得更加清晰。

© www.soinside.com 2019 - 2024. All rights reserved.