Pertanyaan simbol makro gdb tidak hadir bahkan ketika menggunakan -g3 atau -ggdb3 atau -gdwarf-4


Saya memiliki file C ini (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;
}

yang saya kompilasi dengan:

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

lalu debug dengan

$ 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

Ini digunakan untuk bekerja. Saya memerlukan ini untuk bekerja karena saya menggunakan pustaka yang #mendefinisikan nama untuk periferal perangkat keras dan alamat memori.

Ini tampaknya bertentangan langsung dengan perilaku yang ditunjukkan pada Situs gdb sourceware.

Apa yang saya lakukan salah?


5
2018-05-08 09:42


asal


Jawaban:


Sepertinya makro harus "dibawa dalam ruang lingkup" dengan satu atau lain cara. Jika Anda mengikuti persis contoh di halaman yang Anda tautkan, mereka bekerja seperti yang diiklankan (setidaknya mereka melakukannya untuk saya).

Contoh (t.c adalah file sumber Anda):

$ 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) 

Atau:

$ 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) 

10
2018-05-08 09:55



Coba lakukan a list pertama:

(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)

1
2018-05-08 09:55



Saya mendapat masalah sampel dan menyadari bahwa saya menggunakan gcc versi lama.

sebelumnya saya menggunakan gcc 3.46 dan gdb 7.3, ekspansi makro tidak berfungsi, upgrade gcc ke 4.5.2 dan gdb ke 7.5 memecahkan masalah.


1
2017-12-25 07:19



gdb bekerja pada executable dimana semua macro Anda diganti pada waktu preprocessing hanya jadi M tidak hadir dalam konteks


0
2018-05-08 10:07