使用gdb在C预处理器宏中调试崩溃

Tor*_*ten 2 c macros gdb c-preprocessor

我有一个带有多行宏的C程序,程序在宏中崩溃,我怎样才能找到发生崩溃的位置?

这是我的程序的简化版本.实际上CRASHES是多条线很长并且不容易手动扩展.

#include <stdio.h>
#include <stdarg.h>
#define CRASHES(ptr) \
    (*(ptr) == 123)
main()
{
    char *foo = NULL;
    if (CRASHES(foo))
        printf("This will never happen.");
}
Run Code Online (Sandbox Code Playgroud)

在编译和运行时,gdb a.out我得到了预期的EXC_BAD_ACCESS(我在Mac OS X上使用gdb 6.3),但是崩溃指向第8行而不是第4行,实际上是崩溃.

我已经尝试使用其他调试标志编译程序,-gdwarf-2-g3按照文档的建议进行编译,并assert()在宏本身中插入了几个.不幸的是,没有提供更多信息.

Fre*_*ihl 8

这里有很多有关宏调试的宝贵信息.

...另一种方法是使用预处理器,即使用编译它-E并将扩展的宏复制粘贴到src代码中,看看是否可以从那里进行调试.