gdb - 如何进入多行宏定义

4

我正在调试来自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个回答

3
有没有一种方法可以进入包含多行代码的宏中?无论宏是否只有单行代码,你都不能进入宏,因为预处理器会在编译器看到之前扩展宏的主体。宏只是一种简写方式,类似于剪切/粘贴,所以没有地方可以进入 - 它全部变成当前函数的一部分。要更好地理解这一点,请查看预处理后的代码(从gcc -E foo.c输出)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接