Вопрос по gdb, c – Макро-символы GDB отсутствуют даже при использовании -g3 или -ggdb3 или -gdwarf-4

7

У меня есть этот файл C (sample.c):

#include <stdio.h>
#define M 42
#define ADD(x) (M + x)
int main ()
{
  printf("%d\n", M);
  printf("%d\n", ADD(2));
  return 0;
}

который я собираю с:

$ gcc -O0 -Wall -g3 sample.c -o sample

затем отладить с

$ gdb ./sample
GNU gdb (Gentoo 7.3.1 p2) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.gentoo.org/>...
Reading symbols from /tmp/sample...done.
(gdb) macro list
(gdb) macro expand ADD(2)
expands to: ADD(2)
(gdb) print M
No symbol "M" in current context.
(gdb) q

Это раньше работало. Мне нужно, чтобы это работало, потому что я использую библиотеки, которые #define имена для аппаратных периферийных устройств и адресов памяти.

Это, кажется, находится в прямом противоречии с поведением, которое показано наSourceware GDB сайт.

Что я делаю неправильно?

Какая у вас версия GCC? У меня работает на GCC 4.8 GDB 7.7.1 на Ubuntu 14.04. Связанные с:stackoverflow.com/questions/2934006/… Ciro Santilli 新疆改造中心 六四事件 法轮功

Ваш Ответ

4   ответа
2

list первый:

(gdb) list
1       #include <stdio.h>
2       #define M 42
3       #define ADD(x) (M + x)
4       int main ()
5       {
6         printf("%d\n", M);
7         printf("%d\n", ADD(2));
8         return 0;
9       }
10
(gdb) info macro M
Defined at /home/ouah/tst.c:2
#define M 42
(gdb) info macro ADD
Defined at /home/ouah/tst.c:3
#define ADD(x) (M + x)
(gdb)
Error: User Rate Limit Exceeded hazelnusse
12

что макросы должны быть "введены в область видимости" так или иначе. Если вы будете точно следовать примерам на странице, на которую вы ссылаетесь, они будут работать так, как рекламируется (по крайней мере, для меня).

Пример (t.c ваш исходный файл):

$ gcc -O0 -g3 t.c
$ gdb ./a.out 
GNU gdb (Gentoo 7.3.1 p2) 7.3.1
...
Reading symbols from .../a.out...done.
(gdb) info macro ADD
The symbol `ADD' has no definition as a C/C++ preprocessor macro
at <user-defined>:-1
             // Macros not loaded yet
(gdb) list main
1   #include <stdio.h>
2   #define M 42
3   #define ADD(x) (M + x)
4   int main ()
5   {
6     printf("%d\n", M);
7     printf("%d\n", ADD(2));
8     return 0;
9   }
(gdb) info macro ADD
Defined at /home/foo/tmp/t.c:3
#define ADD(x) (M + x)
             // Macros "in scope"/loaded
(gdb) macro expand ADD(42)
expands to: (42 + 42)
(gdb) macro expand M      
expands to: 42
(gdb) macro expand ADD(M)
expands to: (42 + 42)
(gdb) 

Или же:

$ gdb ./a.out 
GNU gdb (Gentoo 7.3.1 p2) 7.3.1
...
Reading symbols from .../a.out...done.
(gdb) macro expand ADD(1)
expands to: ADD(1)
             // Macros not available yet
(gdb) break main
Breakpoint 1 at 0x400538: file t.c, line 6.
(gdb) r
Starting program: /home/foo/tmp/a.out 
Breakpoint 1, main () at t.c:6
6     printf("%d\n", M);
(gdb) macro expand ADD(1)
expands to: (42 + 1)
             // Macros loaded
(gdb) 
Error: User Rate Limit Exceeded hazelnusse
1

ранее я использовал gcc 3.46 и gdb 7.3, расширение макросов не работало, обновление gcc до 4.5.2 и gdb до 7.5 решило проблему.

0

где все ваши макросы заменяются только во время предварительной обработки, поэтому M не присутствует в контексте

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded hazelnusse
Error: User Rate Limit Exceeded

Похожие вопросы