Отладка сбоя в макросе препроцессора C с помощью gdb - PullRequest
2 голосов
/ 27 июня 2011

У меня есть программа 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.");
}

При компиляции и запуске с помощью gdb a.out я получаю ожидаемое EXC_BAD_ACCESS (Я на Mac OS X с GDB 6.3), однако сбой указывает на строку 8, а не на строку 4, где сбой фактически вызван.

Я уже пытался скомпилировать программу с дополнительными флагами отладки -gdwarf-2 и -g3, как предложено docs и вставил несколько assert() s в сам макрос.К сожалению, это не предоставило больше информации.

Ответы [ 4 ]

8 голосов
/ 27 июня 2011

много ценной информации здесь об отладке макросов.

... другой подход заключается в использовании препроцессора, т.е. скомпилировать его с помощью -E и скопировать и вставить развернутый макрос вваш src-код и посмотрите, сможете ли вы отлаживать оттуда.

1 голос
/ 27 июня 2011

Конечно, это происходит сбой, так как вы используете NULL-указатель ... (это был не тот вопрос, верно?).С этим конкретным примером это просто: gcc -g2, а gdb говорит

Program received signal SIGSEGV, Segmentation fault.
0x080483d9 in main () at crash.c:10
10      if (CRASHES(foo))

, что довольно ясно, вы сами расширяете макрос и понимаете, почему (так как * foo == 123 обращайтесь к памяти, вы можетечитаю, так как foo равен NULL).В более сложных случаях gcc -E помогает или избегает использования макросов.

0 голосов
/ 27 июня 2011

Вы ничего не говорите о как падает. Если это ошибка, помните, что это может произойти немного позже, чем когда вы на самом деле разыменовали неверное значение указателя.

0 голосов
/ 27 июня 2011

Есть ли какой-нибудь способ, которым вы могли бы преобразовать его в реальную функцию?Это одно из величайших зол макросов.

...