Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gdb watchpoint on struct variables

I have a structure like this :

    struct A 
    {
        int a; 
        char b; 
    };

this structure is referenced at various places in a large code. The pointer to this struct is passed on to different functions and accordingly the variables in this structure are updated. i want to set a watchpoint on variable a in this struct as it travels across many functions. to see how a changes. How do I set this watch point ?

like image 529
KernelMonk Avatar asked May 31 '12 11:05

KernelMonk


People also ask

How do I add a watchpoint in GDB?

If GDB cannot set a hardware watchpoint, it sets a software watchpoint, which executes more slowly and reports the change in value at the next statement, not the instruction, after the change occurs. You can force GDB to use only software watchpoints with the set can-use-hw-watchpoints 0 command.

What is the difference between breakpoint and watchpoint?

A watchpoint is similar to a breakpoint, but it is the address of a data access that is monitored rather than an instruction being executed. You specify a global variable or a memory address to monitor. Watchpoints are sometimes known as data breakpoints, emphasizing that they are data dependent.

How do you set a watch point?

You can set a watchpoint on a global variable by highlighting the variable in the editor, or by selecting it in the Outline view. To set a watchpoint on a global variable: Highlight the variable in the editor, or select it in the Outline view. Click Run > Toggle Watchpoint.


2 Answers

First set a breakpoint where you create an instance of your struct using break, like

break myfile.c:9

Then just use watch to set a watchpoint, like

watch myStructInstance.a

for variable a or

watch *0x7ffff75177f0

for a memory address. The memory address can be obtained easily by using print, like

print &myStructInstance.a

Now every time variable a or the given memory address gets modified gdb will break.

like image 77
scai Avatar answered Sep 22 '22 03:09

scai


I come with the same problem when debugging my virtual memory simulator. The problem is how to keep a close look at the data inside structs.

I tried using print to check, but that's too noisy. Because I have to print out more than 15 variables.

I also tried using watchpoint, but on my machine, I can only set no more than 4 hardware watchpoints. That's not even close to my goal.

Finally, I find my solution by using user-defined function in .gdbinit file. e.g. if I want to watch array of my structure, using

define lookintoStructs
    if mystruct != 0x0
        print mystruct[0]
        print mystruct[1]
        print mystruct[2]
        print mystruct[3]
        print mystruct[4]
        print mystruct[5]
    end
end

to make it more convenient to use, I'd like to make it hook to my next instruction in gdb.

define hook-next
    lookintoStructs
end

so when I call next or n in gdb, lookintoStructs could be called automatically. works fine for me.

like image 36
Richard Lee Avatar answered Sep 23 '22 03:09

Richard Lee