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.

1
  • 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). Commented Oct 21, 2020 at 21:32

1 Answer 1

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)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.