我正在调试 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/