我有一個ç程序與多行宏和宏內的程序崩潰,我怎麼能找準宏觀在崩潰發生中的位置?調試C預處理器宏內崩潰使用gdb
這裏是我的程序的簡化版本。實際上,CRASHES
是多行,不容易手動擴展。
#include <stdio.h>
#include <stdarg.h>
#define CRASHES(ptr) \
(*(ptr) == 123)
main()
{
char *foo = NULL;
if (CRASHES(foo))
printf("This will never happen.");
}
當編譯,並與gdb a.out
運行此我得到預期的EXC_BAD_ACCESS
(我是Mac OS X上使用gdb 6.3),但飛機墜毀點,8號線,而不是4號線在崩潰實際上造成的。
我已經嘗試過用額外的調試標誌-gdwarf-2
和-g3
編譯程序由docs的建議和宏本身中插入幾個assert()
秒。不幸的是,沒有提供更多的信息。
爲什麼應該是第4行?該崩潰位於第8行,宏被擴展和使用。這個宏本身並沒有導致段錯誤,這是因爲foo的值,在這種情況下,所以它是正確的,崩潰位於第8行。如果它指向4將是誤導。 – ShinTakezou