13

On a large C application, I have set a hardware watchpoint on a memory address as follows:

(gdb) watch *0x12F5D58
Hardware watchpoint 3: *0x12F5D58

As you can see, it's a hardware watchpoint, not software, which would explain the slowness.

Now the application running time under debugger has changed from less than ten seconds to one hour and counting. The watchpoint has triggered three times so far, the first time after 15 minutes when the memory page containing the address was made readable by sbrk. Surely during those 15 minutes the watchpoint should have been efficient since the memory page was inaccessible? And that still does not explain, why it's so slow afterwards.

The platform is x86_64 and the GDB versions are Ubuntu 9.10 package:

$ gdb --version
GNU gdb (GDB) 7.0-ubuntu
[...]

and stock GDB 7.1 built from sources:

$ gdb-7.1 --version
GNU gdb (GDB) 7.1

Thanks in advance for any ideas as what might be the cause or how to fix/work around it.

EDIT: removed cast

EDIT: gdb 7.1

Laurynas Biveinis
  • 10,547
  • 4
  • 53
  • 66
  • Is it always slow when running under the debugger, or only when you have a watchpoint set? – Gabe Mar 18 '10 at 17:07

4 Answers4

10

I discovered that watching a large character buffer was very slow, whereas watching a character in that buffer was very fast.

e.g.

static char buf[1024];
static char* buf_address = &buf;

watch buf_address - excruciatingly slow.

watch *buf_address - very fast.

Marko
  • 20,385
  • 13
  • 48
  • 64
Charlie
  • 101
  • 1
  • 2
5

It's most likely because you're casting it each time. Try this:

(gdb) watch *0x12F5D58

Another option is that you have too many hardware watchpoints set, so gdb is forced to use software watchpoints. Try checking how many watchpoints you have using:

(gdb) info break

and see if you can disable some watchpoints.

Nathan Fellman
  • 122,701
  • 101
  • 260
  • 319
5

I've actually had trouble with hardware watchpoints in GDB 7.x.x., which is not acceptable since watchpoints are a necessity in my job.

On advice from a co-worker, I downloaded the source for 6.7.1 and built it locally. Watchpoints work much better now.

Might be worth a try.

alesplin
  • 1,332
  • 14
  • 23
  • Interesting. I will try this out. – Laurynas Biveinis Mar 22 '10 at 10:29
  • 1
    GDB 6.7.1 is missing a feature where one can use watchpoints on memory address that is inaccessible at the watchpoint setup time. It is possible to enable it at the right time, but this will be more involved, I will try later. I have also tried just released GDB 7.1, same problem as with 7.0. – Laurynas Biveinis Mar 24 '10 at 12:18
  • with conditional breakpoints and breakpoint commands you might be able to work around that without too much trouble. – alesplin Mar 24 '10 at 17:09
1

On x86 you have the following limitation: all your watchpoints can cover no more than four memory addresses, each address of memory can watch for one memory word - this is because hardware watchpoints (the fast ones) use the processors debug registers, an you have four of them, therefore four locations to watch for.