Ok, after the latest round of changes, I was not able to reproduce the behaviour where we would continually be-continually re-hitting a watchpoint. However, I did manage to get the lldb-server to hang if I set two watchpoints close to each other and trigger them both with a single instruction. I added it as TestMultipleHits.py. However, this seems like a lldb-server problem, so it's probably not going to be interesting to you. But maybe Omair would take a look (?)
To get watchpoints working at all, I had to revert your latest patch -- it was causing watchpoints to be re-enabled before we actually stepped-over them, causing a different kind of a loop. Let me know if you have questions about that. cheers, pl On 20 October 2016 at 19:43, Jim Ingham <jing...@apple.com> wrote: > Ah, I see, thanks. If you can make a test case that fails on ARM in the > current state of things, I would be interested in taking a look at it. We > had to do an analogous little dance for stepping from one breakpoint to > another. Probably not the same solution, but we can surely get this to work. > > Jim > > >> On Oct 20, 2016, at 3:12 AM, Pavel Labath <lab...@google.com> wrote: >> >> The reason you could not see this is that the issue is specific to arm >> (or any target that reports watchpoint hits *before* executing the >> instruction tripping the watch). In this case, we have special logic >> in the client which removes the watchpoint, does a single step, and >> reinstates the watchpoint. This code does not correctly handle the >> case when you hit *another* watchpoint while "stepping over" the first >> one. >> >> I was not able to reproduce the exact original problem now (I was >> doing it with one of Omair's previous changes applied, so it may not >> be possible to reproduce on trunk), but here is another way this >> problem manifests itself: >> >> >> Process 6009 stopped >> * thread #1: tid = 6009, 0xaac67324 a.out`main + 16 at a.c:2, name = >> 'a.out', stop reason = breakpoint 1.1 >> frame #0: 0xaac67324 a.out`main + 16 at a.c:2 >> 1 int x; >> -> 2 int main () { x = 47; return 0; } >> (lldb) fr var &x >> (int *) &x = 0xaac69004 >> (lldb) watchpoint set expression -s 1 -- 0xaac69004 >> Watchpoint created: Watchpoint 6: addr = 0xaac69004 size = 1 state = >> enabled type = w >> new value: 0 >> (lldb) watchpoint set expression -s 1 -- 0xaac69005 >> Watchpoint created: Watchpoint 7: addr = 0xaac69005 size = 1 state = >> enabled type = w >> new value: 0 >> (lldb) c >> Process 6009 resuming >> >> At this point, it appears as if the inferior keeps running and never >> hits the watchpoint, but if you check the packet log you will see that >> LLDB is continuously busy sending vCont packets trying to step over >> the watchpoint hit. >> Note that after Omair's change it will not be possible anymore to >> reproduce the problem this easily, as he forbids the creation of >> watchpoints within the same block, but you can reproduce still >> reproduce it by having a signle instruction that writes to two blocks >> (stp is a good candidate for that). >> >> If you are more than curious and want to dig into that I can make a >> better repro case for it. >> >> pl >> >> >> >> On 19 October 2016 at 18:34, Jim Ingham <jing...@apple.com> wrote: >>> >>>> On Oct 4, 2016, at 9:28 AM, Pavel Labath via lldb-commits >>>> <lldb-commits@lists.llvm.org> wrote: >>>> >>>> Also, apparently lldb has a bug, where it mishandles the case where you do >>>> a (user-level) single step over an instruction triggering a watchpoint. >>>> That would be pretty important to fix as well. >>> >>> Do you have a reference for this? In a trivial case, it works correctly on >>> MacOS so far as I can tell: >>> >>> (lldb) si >>> Process 99358 stopped >>> * thread #1: tid = 0x148d67e, function: main , stop reason = instruction >>> step into >>> frame #0: 0x0000000100000f5e changeit`main at changeit.c:9 >>> 6 >>> 7 printf("my_var is: %d.\n", my_var); >>> 8 >>> -> 9 my_var = 20; >>> 10 >>> 11 printf("my_var is: %d.\n", my_var); >>> 12 >>> changeit`main: >>> -> 0x100000f5e <+46>: movl $0x14, -0x8(%rbp) >>> 0x100000f65 <+53>: movl -0x8(%rbp), %esi >>> 0x100000f68 <+56>: movl %eax, -0xc(%rbp) >>> 0x100000f6b <+59>: movb $0x0, %al >>> (lldb) si >>> >>> Watchpoint 1 hit: >>> old value: 10 >>> new value: 20 >>> Process 99358 stopped >>> * thread #1: tid = 0x148d67e, function: main , stop reason = watchpoint 1 >>> frame #0: 0x0000000100000f65 changeit`main at changeit.c:11 >>> 8 >>> 9 my_var = 20; >>> 10 >>> -> 11 printf("my_var is: %d.\n", my_var); >>> 12 >>> 13 return 0; >>> 14 } >>> changeit`main: >>> -> 0x100000f65 <+53>: movl -0x8(%rbp), %esi >>> 0x100000f68 <+56>: movl %eax, -0xc(%rbp) >>> 0x100000f6b <+59>: movb $0x0, %al >>> 0x100000f6d <+61>: callq 0x100000f80 ; symbol stub for: >>> printf >>> >>> Jim >>> > _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits