gcc - gdb - 如何进入多行宏

标签 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)

问题

有什么方法可以进入包含多行代码的宏吗?

最佳答案

Is there any way to step into macros containing multiple lines of code?

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

宏只是一种简写,如果您愿意,可以进行剪切/粘贴,因此无处可以介入——它都成为当前函数的一部分。

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

关于gcc - gdb - 如何进入多行宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49785281/

相关文章:

c - gcc 内置原子比较和交换

c - 我什么时候应该提供 #defined 宏来在 Linux 内核中声明或初始化变量?

ios - 由于持有malloc锁而取消了调用,因此调用运行时并不安全-在iOS中

linux - 如何 self dlopen一个可执行二进制文件

java - 是否可以在没有外部程序的情况下用 Java 编译成机器码?

c++ - 定义指数预处理器宏

c - C 中局部堆栈变量存储在哪里?

c - 如何在automake c项目中获取调试符号?

C如何定义一个可以被预处理器检查的上下文

objective-c - 在 Objective-C 中存储 iOS 应用程序常量