gpt4 book ai didi

c++ - 在 gdb 的帮助下调试宏

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:50 31 4
gpt4 key购买 nike

我知道另一种方法是将宏转换为内联函数,这将允许 gdb 进入它。

但我想知道是否有任何方法可以像使用任何其他函数一样使用 gdb 来调试宏定义的每一行。

例如在下面的代码片段中。

#define print_macro printf("We're inside the macro now");\
for(int i=0; i<100; i++) \
{ \
if(i%2 == 0) \
printf("%d is even number", i); \
else \
printf("%d is odd number);\
}

int main()
{
print_macro;
return 0;
}

在 gdb 提示符下,我们可以在 main 中打断,然后进入 print_macro 并使用 next 逐行检查其定义的每一行

最佳答案

调试困难是应该避免使用宏的原因之一。不,你不能逐行调试宏命令,你不能在宏中设置断点,你不能在宏中看到变量值等。至少有两个原因:

技术。编译器根本不知道宏扩展。在调用编译器之前,预处理器会展开所有宏。编译器将无法为寻址宏行添加调试信息,编译器没有!因此调试器只能假设预处理器究竟如何执行宏扩展。

逻辑。输出的C++代码命令不一定对应一行(一个)宏。从结构和句法上看,宏代码可能完全不像 C++ 代码。这种逐行宏调试似乎仅对于像您这样的简单示例才合乎逻辑,在这些示例中,生成的 C++ 代码很容易查看(对您来说很容易,但对调试器来说却不是!)。但考虑一个更复杂的例子。在此示例中,调试器应指示在哪一行?我认为 ASSIGN(VAR(INT, i), 10); 是唯一合乎逻辑的选项。

#define INT int
#define VAR(TYPE, NAME) TYPE NAME
#define ASSIGN(V, VAL) V = VAL

ASSIGN(VAR(INT, i), 10);

您不能将宏作为 С++ 代码进行调试,因为它们不是直接的 С++ 代码!但是,您可以按照建议展开宏进行调试。如果您需要像宏一样的灵 active 但又没有调试问题,请使用模板函数。

关于c++ - 在 gdb 的帮助下调试宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56393891/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com