I don't see this fail, even for function calls:

(lldb) b s -n main
Breakpoint 1: 3 locations.
(lldb) run
Process 96310 launched: 
'/Users/jingham/Projects/Sketch/build/Debug/Sketch.app/Contents/MacOS/Sketch' 
(x86_64)
Process 96310 stopped
* thread #1: tid = 0x1c03, function: main , stop reason = breakpoint 1.1
    frame #0: 0x000000010001a74e Sketch`main at SKTMain.m:11
   8    
   9    
   10   int main(int argc, const char *argv[]) {
-> 11       NSLog (@"Added for testing rebuilds.");
   12       const char *names[20];
   13       for (int i = 0; i < argc; i++)
   14       {
(lldb) expr (int) printf ("Some text here.\n")
(int) $0 = 16
Some text here.
(lldb) log enable lldb step
(lldb) c
<lldb.driver.main-thread> Pushing plan: "Single stepping past breakpoint site 3 
at 0x10001a74e", tid = 0x1c03.
<lldb.driver.main-thread> ThreadPlanCallFunction(0x7f8eb4189540): DoTakedown 
called as no-op for thread 0x1c03, m_valid: 1 complete: 1.

<lldb.driver.main-thread> WillResume Thread #1: tid = 0x1c03, pc = 0x10001a74e, 
sp = 0x7fff5fbff4a0, fp = 0x7fff5fbff5e0, plan = 'Step over breakpoint trap', 
state = stepping, stop others = 1
<lldb.process.internal-state(pid=96310)> Current Plan for thread 1 (0x1c03): 
Step over breakpoint trap being asked whether we should report run.
Process 96310 resuming
<lldb.process.internal-state(pid=96310)> 
<lldb.process.internal-state(pid=96310)> ThreadList::ShouldStop: 1 threads
<lldb.process.internal-state(pid=96310)> Thread::ShouldStop for tid = 0x1c03, 
pc = 0x000000010001a751
<lldb.process.internal-state(pid=96310)> ^^^^^^^^ Thread::ShouldStop Begin 
^^^^^^^^
<lldb.process.internal-state(pid=96310)> Plan stack initial state:
  Plan Stack for thread #1: tid = 0x1c03, stack_size = 2
    Element 1: Single stepping past breakpoint site 3 at 0x10001a74e
    Element 0: Base thread plan.

<lldb.process.internal-state(pid=96310)> Plan Step over breakpoint trap 
explains stop, auto-continue 1.
<lldb.process.internal-state(pid=96310)> Plan Step over breakpoint trap should 
stop: 0.
<lldb.process.internal-state(pid=96310)> Completed step over breakpoint plan.
<lldb.process.internal-state(pid=96310)> Popping plan: "Step over breakpoint 
trap", tid = 0x1c03.
<lldb.process.internal-state(pid=96310)> Plan stack final state:
  Plan Stack for thread #1: tid = 0x1c03, stack_size = 1
    Element 0: Base thread plan.
  Completed Plan Stack: 1 elements.
    Element 0: Single stepping past breakpoint site 3 at 0x10001a74e

The call to printf definitely ran code in the target, and yet continue pushed 
the "step over breakpoint" plan rather than stopping with another breakpoint 
hit (which is what I presume you are seeing?)

Jim


On Dec 6, 2012, at 1:01 PM, "Kopec, Matt" <[email protected]> wrote:

> Daniel and I saw the same behaviour as Andy on Mac recently though we 
> reproduced it differently. If I recall what was happening on Mac correctly, 
> the expression to be evaluated didn't require MCJIT/executing in the target 
> process (for instance, printing a register value - expr pc) but on Linux did 
> require MCJIT/running in the target. However, evaluating a function call 
> expression did reproduce the problem on Mac since this did go through the 
> MCJIT route. Could you try this to see if it reproduces the problem?
> 
> Thanks,
> Matt
> ________________________________________
> From: [email protected] [[email protected]] on behalf 
> of Jim Ingham [[email protected]]
> Sent: Thursday, December 06, 2012 2:05 PM
> To: Kaylor, Andrew
> Cc: [email protected]
> Subject: Re: [lldb-dev] Continue misfiring after expression evaluation
> 
> Yeah, after taking a quick look at the code last night, I'm curious too.
> 
> I am in the middle of something right now, but as soon as I get a chance, 
> I'll step through it and see what's going on.
> 
> Thinking about it a little bit more, I can't see any reason why 
> Process::RunThreadPlan should not clear the evidence of its work from the 
> plan stack.  It should only do this if the plan succeeds, or if it is going 
> to unwind on error.  If you're going to stop because you hit a breakpoint in 
> the middle of a function call, you don't want to change the plan stack state 
> (just like you don't want to restore the old stop info.)  And I think it 
> would be wrong to erase the whole completed plan stack, better to mark the 
> position on entry, and restore it to the state it had when you entered 
> RunThreadPlan.
> 
> Jim
> 
> On Dec 6, 2012, at 10:54 AM, "Kaylor, Andrew" <[email protected]> wrote:
> 
>> I updated to the latest code and I'm still seeing the same behavior.
>> 
>> That is, thread_plan_sp->RestoreThreadState() is being called, and it does 
>> restore the stop info for the thread to the old stop info, but when 
>> Thread::SetupForResume() calls Thread::GetStopInfo() that function creates 
>> stop info based on the completed thread plan stack rather than using 
>> m_actual_stop_info_sp.
>> 
>> Any suggestions?  I'd be curious to know why this doesn't happen on Mac OS X 
>> because it looks like it would.
>> 
>> -Andy
>> 
>> -----Original Message-----
>> From: [email protected] [mailto:[email protected]] On 
>> Behalf Of Kaylor, Andrew
>> Sent: Wednesday, December 05, 2012 4:38 PM
>> To: Jim Ingham
>> Cc: [email protected]
>> Subject: Re: [lldb-dev] Continue misfiring after expression evaluation
>> 
>> Hi Jim,
>> 
>> I am working with an old version of the code, so things were in a bit 
>> different state for me.  I was seeing 
>> Thread::RestoreThreadStateFromCheckpoint() being called.  The problem is 
>> that when Thread::SetupForResume() calls Thread::GetStopInfo(), the latter 
>> does this:
>> 
>>   ThreadPlanSP plan_sp (GetCompletedPlan());
>>   if (plan_sp && plan_sp->PlanSucceeded())
>>       return StopInfo::CreateStopReasonWithPlan (plan_sp, 
>> GetReturnValueObject());
>>   else
>>   {
>>       ProcessSP process_sp (GetProcess());
>>       if (process_sp
>>           && m_actual_stop_info_sp
>>           && m_actual_stop_info_sp->IsValid()
>>           && m_thread_stop_reason_stop_id == process_sp->GetStopID())
>>           return m_actual_stop_info_sp;
>>       else
>>           return GetPrivateStopReason ();
>>   }
>> 
>> Since the completed stop plan from the expression command is still around, 
>> the stop info comes from there.  The thread's m_actual_stop_info seems to be 
>> correct, but the code doesn't get to the point where it would use it.
>> 
>> I'll update to the latest code and see if this is still happening, but I 
>> wanted to tell you what I knew while I was still in a known state.  I'll let 
>> you know what happens with the new code.
>> 
>> -Andy
>> 
>> -----Original Message-----
>> From: Jim Ingham [mailto:[email protected]]
>> Sent: Wednesday, December 05, 2012 3:50 PM
>> To: Kaylor, Andrew
>> Cc: [email protected]
>> Subject: Re: [lldb-dev] Continue misfiring after expression evaluation
>> 
>> I don't see this happening on Mac OS X.  That test succeeds, and I don't see 
>> the behavior you describe.
>> 
>> You should not need to clear the completed plan stack.  The way it is 
>> supposed to work is as follows:
>> 
>> Running functions is always done by Process::RunThreadPlan.  After the 
>> ThreadPlanCallFunction gets done running in that function, we do this bit of 
>> code:
>> 
>>       // Restore the thread state if we are going to discard the plan 
>> execution.
>> 
>>       if (return_value == eExecutionCompleted || discard_on_error)
>>       {
>>           thread_plan_sp->RestoreThreadState();
>>       }
>> 
>> That should set the StopInfo that was squirreled away in 
>> Thread::CheckpointThreadState back as the current StopInfo for the thread.  
>> Is that getting called?  If not, why not?  If it is getting called, why 
>> isn't it succeeding in resetting the thread's StopInfo back to the old 
>> reason?
>> 
>> Note, up till a couple of weeks ago this work was done in the DoTakedown 
>> method of ThreadPlanCallFunction, but I moved resetting the StopInfo out of 
>> that function (which gets called while the stop event for the function call 
>> is still being processed) to here, because otherwise it might trigger the 
>> original StopInfo's PerformAction while you are in the middle of handing the 
>> ThreadPlanCallFunction's execution, which isn't right.
>> 
>> Hope that helps.
>> 
>> Jim
>> 
>> On Dec 5, 2012, at 3:28 PM, "Kaylor, Andrew" <[email protected]> wrote:
>> 
>>> Hi all,
>>> 
>>> I've been debugging a problem on Linux where if you hit a breakpoint, then 
>>> evaluate an expression that requires JITing, then continue LLDB will break 
>>> at the line you were already on.  I don't know if this problem is specific 
>>> to Linux, but that's where I'm debugging it.  This problem appears in the 
>>> 'lang/c/setvalues/TestSetValues.py' test case, but can also be reproduced 
>>> manually.
>>> 
>>> What I'm seeing is that when the 'continue' handling calls 
>>> Thread::SetupForResume() the current Thread reports its stop reason as 
>>> 'eStopReasonPlanComplete' because the ThreadPlan for evaluating the 
>>> expression is still on the completed plans stack.  As a result, the 
>>> ThreadPlanStepOverBreakpoint plan doesn't get queued.  If I add calls to 
>>> 'm_completed_plan_stack.clear()' and 'm_discarded_plan_stack.clear()' at 
>>> the top of the 'if (GetResumeState() == eStateSuspended)' block in 
>>> Thread::SetupForResume() then everything works as expected.
>>> 
>>> Obviously, that feels like a pretty risky thing to do, at best.  It seems 
>>> like the expression command handling should have done something to clear 
>>> the completed plan stack when it was finished, but as of yet I haven't 
>>> found a place where that is appropriate.
>>> 
>>> Can anyone give me guidance on this issue?
>>> 
>>> Thanks,
>>> Andy
>>> _______________________________________________
>>> lldb-dev mailing list
>>> [email protected]
>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>> 
>> 
>> _______________________________________________
>> lldb-dev mailing list
>> [email protected]
>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
> 
> _______________________________________________
> lldb-dev mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

_______________________________________________
lldb-dev mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to