2016-06-03 2 views
2

Почему GDB не выводит значение макроса в следующем примере?Символ `M 'не имеет определения как макрос препроцессора C/C++

❯ cat sample.c 
#include <stdio.h> 

#define M 42 

int main(int argc, const char **argv) 
{ 
    printf("M: %d\n", M); 
    return 0; 
} 

❯ rm -f sample 
❯ gcc -Wall -g3 -ggdb -gdwarf-2 sample.c -o sample 
❯ gdb sample 

gdb> break main 
gdb> run 
gdb> info macro M 
    The symbol `M' has no definition as a C/C++ preprocessor macro 
    at <user-defined>:-1 
gdb> continue 
    Continuing. 
    M: 42 

Спасибо!

❯ gcc --version 
Apple LLVM version 7.3.0 (clang-703.0.29) 
❯ gdb --version 
GNU gdb (GDB) 7.10.1 
+1

Просто спрашивайте, если вы удалите '-O2', это имеет значение? –

+0

@SouravGhosh no effect = ( – itsnikolay

+1

В [tag: c] он должен быть 'int main (int argc, char ** argv)' '' argv' модифицируется, поэтому no 'const'. –

ответ

1

Я получаю разные результаты с GCC 4.4.7 и GDB 7.2, чем вы сообщаете. Использовав свой источник и вашу команду компиляции, мой GDB сессии выглядит следующим образом:

> gdb sample 

[ ... startup banner ... ] 

(gdb) break main 
Breakpoint 1 at 0x4004d3: file sample.c, line 7. 
(gdb) run 
Starting program: /home/jbolling/tmp/sample 

Breakpoint 1, main (argc=1, argv=0x7fffffffcba8) at sample.c:7 
7  printf("M: %d\n", M); 
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.166.el6_7.7.x86_64 
(gdb) info macro M 
Defined at /home/jbolling/tmp/sample.c:3 
#define M 42 
(gdb) continue 
Continuing. 
M: 42 

Program exited normally. 
(gdb) 

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

gdb> info macro M 
    The symbol `M' has no definition as a C/C++ preprocessor macro 
    at <user-defined>:-1 

Примечание, в частности, расположение сообщает GDB: «< определенного пользователь>» файл, номер строки -1. В моем запуске GDB точка останова была связана с первой исходной строкой в ​​теле main(). Я склонен полагать, что если вы разобьетесь, тогда GDB правильно сообщит о определении макроса в этом месте.