gdb - 如何进入多行宏

时间:2018-04-11 22:26:42

标签: gcc macros gdb

我正在调试Micropython中的以下函数,我无法进入宏VERIFY_MARK_AND_PUSH的代码。

我可以进入正常功能,我正在使用-g3 -gdwarf-2进行编译。

void gc_collect_root(void **ptrs, size_t len) {
    for (size_t i = 0; i < len; i++) {
        void *ptr = ptrs[i];
        VERIFY_MARK_AND_PUSH(ptr);
        gc_drain_stack();
    }
}

宏是:

// ptr should be of type void*
#define VERIFY_MARK_AND_PUSH(ptr) \
    do { \
        if (VERIFY_PTR(ptr)) { \
            size_t _block = BLOCK_FROM_PTR(ptr); \
            if (ATB_GET_KIND(_block) == AT_HEAD) { \
                /* an unmarked head, mark it, and push it on gc stack */ \
                DEBUG_printf("gc_mark(%p)\n", ptr); \
                ATB_HEAD_TO_MARK(_block); \
                if (MP_STATE_MEM(gc_sp) < &MP_STATE_MEM(gc_stack)[MICROPY_ALLOC_GC_STACK_SIZE]) { \
                    *MP_STATE_MEM(gc_sp)++ = _block; \
                } else { \
                    MP_STATE_MEM(gc_stack_overflow) = 1; \
                } \
            } \
        } \
    } while (0)

问题

有没有办法进入包含多行代码的宏?

1 个答案:

答案 0 :(得分:1)

  

有没有办法进入包含多行代码的宏?

无法进入宏,无论它是单线还是多线,因为预处理器会在编译器看到它之前展开宏的主体。

宏只是一个简写,如果你愿意,可以剪切/粘贴,所以无处可以进入 - 它们都成为当前函数的一部分。

要更好地理解这一点,请查看预处理代码(gcc -E foo.c的输出)。