Отладка макроса с помощью gdb - PullRequest
2 голосов
/ 31 мая 2019

Я знаю, что альтернативный подход заключается в преобразовании макроса во встроенную функцию, которая позволит GDB войти в него.

Но я хочу знать, есть ли способ отладки черезкаждая строка определения макроса, используя gdb, как и любая другая функция.

, например, в приведенном ниже фрагменте кода.

#define print_macro printf("We're inside the macro now");\
     for(int i=0; i<100; i++) \
     { \
          if(i%2 == 0) \
              printf("%d is even number", i); \
          else \
              printf("%d is odd number);\
     }

int main()
{
    print_macro;
    return 0;
}

В приглашении gdb мы можем перейти в main и затем перейти к print_macro и пройдитесь по каждой строке его определения по очереди, используя next

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Сложность отладки - одна из причин, по которой следует избегать макросов.Нет, вы не можете отлаживать команды макросов построчно, вы не можете устанавливать точки останова в макросе, вы не можете видеть значения переменных в макросе и т. Д. Причины как минимум две:

Технические .Компилятор вообще ничего не знает о расширении макросов.Все макросы раскрываются препроцессором до вызова компилятора.Компилятор не сможет добавить отладочную информацию для адресации строк макросов, у компилятора ее нет!Таким образом, отладчик может только предполагать, как именно препроцессор выполняет расширение макроса.

Logical .Выходная команда кода C ++ не обязательно соответствует одной строке (одной) макрокоманды.Структурно и синтаксически, макрокод может совершенно не походить на код C ++.Такая построчная отладка макросов кажется логичной только для простых примеров, подобных вашему, где результирующий код C ++ легко просматривается (легко для вас, а не для отладчика!).Но рассмотрим более замысловатый пример.На какую строку должен указывать отладчик в этом примере?Я думаю ASSIGN(VAR(INT, i), 10); единственная логическая опция.

#define INT int
#define VAR(TYPE, NAME)  TYPE NAME
#define ASSIGN(V, VAL) V = VAL

ASSIGN(VAR(INT, i), 10);

Вы не можете отлаживать макросы как код С ++, так как они не являются непосредственно кодом С ++!Тем не менее, вы можете расширить макрос для отладки в соответствии с рекомендациями.Если вам нужна гибкость, такая как макросы, но без проблем с отладкой, используйте функции шаблонов.

0 голосов
/ 31 мая 2019

Вы не можете пошагово проходить через макросы, но вы можете использовать флаг -E, чтобы увидеть, что макросы расширяются до:

g++ main.cpp -E | less
...