借助gdb调试宏

时间:2019-05-31 11:03:36

标签: c++ macros gbdk

我知道另一种方法是将宏转换为内联函数,这将使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一步一步地遍历其定义的每一行

3 个答案:

答案 0 :(得分:1)

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

技术。编译器完全不了解宏扩展。在调用编译器之前,所有宏都由预处理器扩展。编译器将无法添加调试信息以寻址宏线,编译器没有它!因此调试器只能假设预处理器执行宏扩展的精确程度。

逻辑。输出的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);

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

答案 1 :(得分:0)

您不能单步执行宏,但可以使用 SyntaxError: Unexpected token o in JSON at position 1 [0] at JSON.parse (<anonymous>) [0] at parse (C:\Users\User\projects\webapp\deck-editor\backend\node_modules\body-parser\lib\types\json.js:89:19) [0] at C:\Users\User\projects\webapp\deck-editor\backend\node_modules\body-parser\lib\read.js:121:18 [0] at invokeCallback (C:\Users\User\projects\webapp\deck-editor\backend\node_modules\raw-body\index.js:224:16) [0] at done (C:\Users\User\projects\webapp\deck-editor\backend\node_modules\raw-body\index.js:213:7) [0] at IncomingMessage.onEnd (C:\Users\User\projects\webapp\deck-editor\backend\node_modules\raw-body\index.js:273:7) [0] at IncomingMessage.emit (events.js:194:15) [0] at endReadableNT (_stream_readable.js:1125:12) [0] at process._tickCallback (internal/process/next_tick.js:63:19) [0] SyntaxError: Unexpected token o in JSON at position 1 [0] at JSON.parse (<anonymous>) [0] at parse (C:\Users\User\projects\webapp\deck-editor\backend\node_modules\body-parser\lib\types\json.js:89:19) [0] at C:\Users\User\projects\webapp\deck-editor\backend\node_modules\body-parser\lib\read.js:121:18 [0] at invokeCallback (C:\Users\User\projects\webapp\deck-editor\backend\node_modules\raw-body\index.js:224:16) [0] at done (C:\Users\User\projects\webapp\deck-editor\backend\node_modules\raw-body\index.js:213:7) [0] at IncomingMessage.onEnd (C:\Users\User\projects\webapp\deck-editor\backend\node_modules\raw-body\index.js:273:7) [0] at IncomingMessage.emit (events.js:194:15) [0] at endReadableNT (_stream_readable.js:1125:12) [0] at process._tickCallback (internal/process/next_tick.js:63:19) 标志来查看宏扩展到的内容:

-E

答案 2 :(得分:0)

查看gdb命令:

gdb> macro expand *expression using macros*
gdb> info macro *macro name*

取决于您的g ++版本,您可能需要在编译命令中添加-ggdb3。

如果多次定义宏,则info macro将默认显示适用于当前位置的宏。 info macro -all ...列出了可能的选择。