Yeah, good point.  In that case, you could just update 
RegisterContextLLDB::SavedLocationForRegister().  Add a little code near the 
top that looks to see if there is the thread has an UnwindHint saying we've 
just stepped-in, and this is frame 0, then we use the 
CreateFunctionEntryUnwindPlan() unwind plan instead of whatever plan we would 
normally use here.




> On Jan 16, 2015, at 6:27 PM, jing...@apple.com wrote:
> 
> So the steps I was thinking of were:
> 
> 1) ThreadPlan notices it is on a branch
> 2) ThreadPlan calls  Thread::SetUnwindHint() which calls into the ABI to 
> write down whatever hints it thinks are appropriate and stuff them into the 
> thread.
> 3) ThreadPlan causes the process to step one instruction
> 4) Whoever goes to create the RegisterContexts & Frames for that thread will 
> have access to the Thread, and thus to the UnwindHint.  So the ThreadPlan 
> doesn't have to get involved.
> 
> I think that should work.
> 
> Jim
> 
> 
>> On Jan 16, 2015, at 5:43 PM, Jason Molenda <jmole...@apple.com> wrote:
>> 
>> The details will be a little tricky on this one.  Frame 0 is probably 
>> created as soon as the process stops - before the ThreadPlan does anything 
>> -- and we need to install the UnwindHint in that frame 0 RegisterContextLLDB 
>> before we start asking anything about frame 1.
>> 
>> StackFrameList is where we call the Unwinder to get stack frames -- e.g. see 
>> StackFrameList::GetFrameAtIndex().
>> 
>> If the ThreadPlan had a chance to execute code before we try to retrieve 
>> stack frame 1 (which it seems like it would -- this is a private stop event 
>> and the ThreadPlan is the guy who is going to ask about stack frame 1 
>> itself), we'd need some way to say give me the RegisterContext for frame 0 
>> and stuff the UnwindHints in that object.
>> 
>> e.g. see how RegisterContextLLDB::InitializeZerothFrame() sets its 
>> m_full_unwind_plan_sp.  This is the UnwindPlan that will be used to find 
>> frame 1's pc, stack pointer, frame pointer, etc, when requested.
>> 
>> 
>> J
>> 
>> 
>>> On Jan 16, 2015, at 4:55 PM, jing...@apple.com wrote:
>>> 
>>> One thing to be careful about if you do this is that there's no guarantee 
>>> that the ThreadPlan will be the first person to ask for the unwind, so 
>>> there might be a bad unwind sitting around.  It would actually be a shame 
>>> if anybody else got their hands on a bad unwind when we knew how to make a 
>>> better one.  So maybe the UnwindHint should hang off the Thread instead, so 
>>> anybody who goes to unwind will see it.
>>> 
>>> Jim
>>> 
>>> 
>>>> On Jan 16, 2015, at 4:17 PM, Reid Kleckner <r...@google.com> wrote:
>>>> 
>>>> Cool, that seems reasonable.
>>>> 
>>>> Sent from phone
>>>> 
>>>> On Jan 16, 2015 4:04 PM, <jing...@apple.com> wrote:
>>>> 
>>>>> On Jan 16, 2015, at 3:55 PM, Reid Kleckner <r...@google.com> wrote:
>>>>> 
>>>>> On Fri, Jan 16, 2015 at 2:53 PM, Jason Molenda <jmole...@apple.com> wrote:
>>>>> In my opinion, expending a lot of energy on making the ThreadPlans know 
>>>>> how to unwind from the first instruction is ignoring the real problem of 
>>>>> being able to unwind accurately from all instruction locations.  It's not 
>>>>> worth doing.  Make the unwinder work from any location on your platform - 
>>>>> if it can't, that's the problem that needs to be fixed.  I agree I think 
>>>>> it would be interesting if the ThreadPlans could identify to the Unwinder 
>>>>> that it has just stepped in to a function for even better reliability in 
>>>>> a particularly tricky unwind scenario.  But it's not a panacea, if that's 
>>>>> the only thing you fix and rely on "walk the frame chain on the stack" to 
>>>>> backtrace, you're going to have a horrible debugger experience.  Even if 
>>>>> you can accurately walk the stack you won't get register save locations, 
>>>>> for instance, so when the debug info says a variable is stored in rbx in 
>>>>> the middle of the stack, and rbx was saved by the callee function to the 
>>>>> stack, you won't be able to re!
 trieve it for the user.
>>>>> 
>>>>> I don't think it's practical to expect the unwinder to *always* work, but 
>>>>> I agree it needs to work most of the time. There are situations when 
>>>>> unwind data just isn't available, like when trying to step over a call to 
>>>>> a function JITed by something you don't control.
>>>>> 
>>>>> Personally, I think it will be a lot more work to make the unwinder 
>>>>> understand PDB information than it will to let ThreadPlan know what looks 
>>>>> a call instruction looks like. Clang will also be generating DWARF for 
>>>>> the forseeable future, so adding PDB reading only helps us debug third 
>>>>> party code, which not very interesting. Adding the call-recognition code 
>>>>> to ThreadPlan will solve the cross-platform problem of stepping over a 
>>>>> call to a function with no CFI. Would you be OK with patches in that 
>>>>> direction?
>>>>> 
>>>>> We do eventually want to use PDBs to support unwinding, but we expected 
>>>>> to get by with just DWARF for some time to come.
>>>> 
>>>> 
>>>> We crossed paths...  See the "UnwindHint" notion I sent in another mail on 
>>>> this thread.  I like that approach better than having the ThreadPlans know 
>>>> about calls because it not only gets stepping right, but passing the hint 
>>>> to the unwinder would not only get the step in to stop as it should, but 
>>>> would also set the unwinder on the right path so that the backtrace at 
>>>> this point would also be correct...  That's important for the user when we 
>>>> do step-in rather than step-over.
>>>> 
>>>> Jim
>>>> 
>>>> 
>>> 
>> 
> 


_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to