On 06/09/2015 02:51 PM, Pedro Alves wrote: > On 06/09/2015 04:00 PM, Luis Machado wrote: >> This is in line with what was done by Joel's patch here: >> >> https://sourceware.org/ml/gdb-patches/2014-11/msg00478.html >> >> And it also answers Pedro's question about whether this is specific to SPARC >> QEMU or not. This indeed seems to affect multiple QEMU targets and also other >> simulators (proprietary). > > Sounds like a different issue, although related. > >> >> I ran into this weird issue of not being able to "finish" an inferior function >> call. It looks as if the program is running away, but it really is stuck >> somewhere. "finish" still works fine for regular functions not called manually >> by GDB. > > Sounds like that would fail on SPARC qemu as well. > >> >> I tracked this failure down to GDB having both a bp_call_dummy and bp_finish in >> its breakpoint list. As a result of one not being considered permanent and the >> other considered permanent, GDB will not issue a Z packet to force the insertion >> of that location's breakpoint, confusing the simulator that does not know how >> to deal properly with these permanent breakpoints that GDB inserted beforehand. >> >> The attached patch fixes this, though i'm inclined to say we could probably >> check if both bp_call_dummy and bp_finish are present and force the >> insertion of that location's breakpoint. It isn't clear to me where exactly that >> check would go or if it would be cleaner than checking that information in >> the same function Joel used. >> >> I see no regressions on x86-64 and it fixes a bunch of failures for simulator >> targets we use (MIPS and PowerPC to name two). > > If it happens that you "finish" from a normal function, and the finish > breakpoint ends up on top of a real permanent breakpoint, then this patch > will make us end up inserting a breakpoint on top of that permanent > breakpoint. I don't see what's special about finish breakpoints; > it's the address (dummy breakpoint location) that is special. It very much > sounds like that any kind of breakpoint that is placed on top of the dummy > breakpoint ends up with the same issue. E.g., if you stepi out of > the called function, with a software single-step breakpoint, sounds like > GDB will miss inserting the software step breakpoint because that's > at the same address as the dummy breakpoint. > > As a data point, I assume that GDB is considering the non-permanent > dummy breakpoint a duplicate of the permanent finish breakpoint and > then none ends up inserted. Is that right? > > Not exactly sure what to do here. Maybe we should stop considering > permanent and non-permanent breakpoints at the same address as > duplicates. That should result in GDB inserting the non-permanent > one, I think. Or we could get stop marking permanent breakpoints > as always inserted, and let normal breakpoints insert on top of > permanent breakpoints normally. See also: > https://sourceware.org/ml/gdb-patches/2015-03/msg00174.html I gave the strategy of not marking permanent breakpoints/locations as inserted a try, and it fixes the simulator problems i've been seeing with the permanent breakpoint locations. One strange side effect of this change on my local machine (x86-64) is that gdb.threads/attach-many-short-lived-threads.exp gives me PASS instead of FAIL when always-inserted mode is ON. I didn't investigate this further though. Is it known that this testcase is affected by permanent breakpoint locations? For example: XFAIL: gdb.threads/attach-many-short-lived-threads.exp: iter 5: attach (EPERM) PASS: gdb.threads/attach-many-short-lived-threads.exp: iter 5: no new threads PASS: gdb.threads/attach-many-short-lived-threads.exp: iter 5: set breakpoint always-inserted on PASS: gdb.threads/attach-many-short-lived-threads.exp: iter 5: break break_fn PASS: gdb.threads/attach-many-short-lived-threads.exp: iter 5: break at break_fn: 1 PASS: gdb.threads/attach-many-short-lived-threads.exp: iter 5: break at break_fn: 2 PASS: gdb.threads/attach-many-short-lived-threads.exp: iter 5: break at break_fn: 3 PASS: gdb.threads/attach-many-short-lived-threads.exp: iter 5: reset timer in the inferior PASS: gdb.threads/attach-many-short-lived-threads.exp: iter 5: print seconds_left PASS: gdb.threads/attach-many-short-lived-threads.exp: iter 5: detach PASS: gdb.threads/attach-many-short-lived-threads.exp: iter 5: set breakpoint always-inserted off Is this patch what you had in mind? Luis