2

For example:

#include <stdlib.h>

#define A 20
#define B 22
#define C (A+B)

int main()
{
    srand(time(0));
    int i = (rand()&1) + C;
    return i;
}

In gdb,

(gdb) print C
No symbol "C" in current context.

How can I know what C is? Can gdb tell me? (I added rand() so we can't easily deduce what it was)

The preprocessor will have replaced C with (20+22). Is this value available in the debuginfo to print somehow?

In a real example where the macro could be exceedingly complex, I don't want to waste my time doing the job of the preprocessor.

jozxyqk
  • 16,424
  • 12
  • 91
  • 180
  • 1
    If you compile with with gcc and pass `-g3` option (for level 3 debugging information) you will have all the macro definitions present in the program. The default is debugging level (with just `-g` is level 2). – darcamo Oct 21 '20 at 21:32

1 Answers1

5

How can I know what C is?

First of all you need to build the program with -g3 flag so that macro information is included in debugging information, start the program and show macro definition with info macro:

(gdb) start
Temporary breakpoint 1 at 0x40114e: file 1.c, line 9.
Starting program: /tmp/a.out 
Missing separate debuginfos, use: dnf debuginfo-install glibc-2.31-4.fc32.x86_64

Temporary breakpoint 1, main () at 1.c:9
9       srand(time(0));
(gdb) info macro C
Defined at /tmp/1.c:5
#define C (A+B)
(gdb) info macro A
Defined at /tmp/1.c:3
#define A 20
(gdb) info macro B
Defined at /tmp/1.c:4
#define B 22

You can also expand macro:

(gdb) macro expand C
expands to: (20+22)
ks1322
  • 33,961
  • 14
  • 109
  • 164