[lldb-dev] Problem unwinding from inside of a CRT function

Hafiz Abid Qadeer hafiz_abid at mentor.com
Wed Jan 21 02:16:37 PST 2015


On 20/01/15 20:15:15, Jason Molenda wrote:
> 
> > On Jan 20, 2015, at 4:21 AM, Hafiz Abid Qadeer
> <hafiz_abid at mentor.com> wrote:
> > 
> > 
> > 
> > GDB also has range stepping thing now.
> > https://sourceware.org/ml/gdb-patches/2013-03/msg00450.html
> 
> 
> 
> Jim points out that this is a different approach than lldb took --
> it's pushing some limited amount of single instruction stepping down
> into the remote stub.
> 
> The cost of single instruction stepping can be broken down into (1)
> time to stop the inferior process, (2) time to communicate inferior
> state between stub and debugger, and (3) time for the debugger decide
> whether to resume the process or not.
> 
> The gdb approach reduces 2 & 3.  lldb's approach is addressing all of
> 1-3.  A single source line may have many function calls embedded
> within it -- printf("%d\n", f(g(x))); -- so lldb will still be need 
> to
> stop the inferior 4 more times than gdb for this sequence (stop at 
> the
> point of the call instruction, then single instruction step into the
> call -- whereas with gdb's approach the stub will single instruction
> step into the call and then report back to gdb).  
> 
> In lldb we've put a lot of time in optimizing #2.  Besides getting 
> rid
> of the "acks" in the gdb-remote protocol by default (needed for an
> unreliable transport medium, like a raw serial connection to a target
> board), we looked at what pieces of information lldb needs to decide
> whether to keep stepping or stop.  It needs to know the stop reason,
> it needs to know the pc, it needs the stack pointer, and it probably
> needs the frame pointer.  So in the "T" packet which the stub sends 
> to
> indicate that the inferior has stopped, we have a list of "expedited
> registers" - register values that the stub provides without being
> asked.
> 
> The result is that every time lldb needs to step a single instruction
> within a function bounds, there are two packets sent:  The "T05"
> packet indicating the inferior stopped, and lldb sending back another
> "vCont;s" packet saying to instruction step again, if appropriate. 
> The overhead of #2 has been dramatically reduced by this approach.  
> (think about a scenario where there are no expedited registers in the
> T packet - the debugger is going to need to ask for each of these
> registers individually, or get all registers via the g packet, and
> it's going to be really slow.)
> 
> 
> The approach Jim did with lldb does assume that you have a
> disassembler with annotations regarding whether an instruction can
> affect flow control - branches, calls, jumps, etc.  The llvm
> disassembler includes these annotations.  Last time I looked at the
> disassembler gdb is using, it doesn't include this kind of 
> information
> about instructions.

Jim & Jason,
Thanks for explaining this in details. I also like the ability provided 
by functions like QueueThreadPlanForStepOverRange. You can experiment 
by providing your own step plan if you want in your process plugin.

Regards,
Abid





More information about the lldb-dev mailing list