Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

help with gdb traces (or similar)

Tags:

c

debugging

gdb

I have an application. I have the source code (in C). I can compile it anyway I want. Add whatever tool I want to it. Etc. However, I do not want to pepper the source code with a bunch of printf's. I want to be able to produce a log of some sort that shows when a particular value (some member of a global structure for example) is written to (its value changes). I'd like to be able to show source file and line number, and the old and new value.

I'd also like to be able to specify the value by name, not address. But address is OK. Bonus points if I can specify a value that is local to a function.

I'm still scratching my head trying to figure out gdb's trace commands. Any help is greatly appreciated. Thanks.

like image 532
tvaughan Avatar asked Aug 25 '09 19:08

tvaughan


1 Answers

First, you'll need to make sure to compile your program with debug symbols, and probably w/o optimization to make gdb most useful. For gcc, that'd be -g -O0.

Second, the feature you're looking for isn't tracing, its watchpoints.

(gdb) help watch
Set a watchpoint for an expression.
A watchpoint stops execution of your program whenever the value of
an expression changes.

So, given some example code:

int main() {
    int a;
    a = 1;
    a = 2;
    return 0;
}

you can then run gdb on it, and:

(gdb) b main
Breakpoint 1 at 0x80483a5: file test.c, line 4.
(gdb) run
Starting program: /tmp/test 

Breakpoint 1, main () at test.c:4
4               a = 1;
(gdb) watch a
Hardware watchpoint 2: a
(gdb) c
Continuing.
Hardware watchpoint 2: a

Old value = -1207552288
New value = 2
main () at test.c:8
8               return 0;

it's working slightly funny due to a being on the stack, not memory. And if optimization were on, it'd work even less: a would be optimized out.

like image 81
derobert Avatar answered Sep 28 '22 02:09

derobert