Hi Pavel,

First of all, thank you for looking into this. I really appreciate it.
Secondly,  the check with GetRestartedFromEvent did the trick.
I am finally getting correct information. Thank You very much.

About the documentation, I really think it can be much better and I
would also help in this case but my english isn't my first language as
I am also not good at expressing the intention of every lldb feature
because obviously I am also just a beginner.

Although I think it would be helpful for other users, that if there
would have been a valid C++ debugging example like my issue
reproduction code.

:)

~Paul



2016-03-04 13:09 GMT+01:00 Pavel Labath <lab...@google.com>:
> Hi Paul,
>
> I believe you are experiencing the same problem as a couple of other
> people before you (see
> <http://lists.llvm.org/pipermail/lldb-dev/2016-January/009293.html>,
> <http://lists.llvm.org/pipermail/lldb-dev/2016-January/009453.html>).
> Basically, you need to ignore the events with the "restarted" flag  by
> checking the GetRestartedFromEvent value for Stopped events. Linux
> broadcasts this event on initial start, but other targets don't. This
> is not a particularly well documented feature, and we would welcome
> any improvements to the documentation. :)
>
> Let me know if you still have problems after adding the check for the
> restarted flag.
>
> cheers,
> pl
>
>
> On 3 March 2016 at 15:26, Pavel Labath <lab...@google.com> wrote:
>> Thanks for the explanation. I'll look this over tomorrow.
>>
>> cheers,
>> pl
>>
>> On 3 March 2016 at 15:23, Paul Peet <paulpee...@gmail.com> wrote:
>>> Hi Pavel,
>>>
>>> This is the code:
>>>
>>> int main() {
>>>   using namespace lldb;
>>>
>>>   SBDebugger::Initialize();
>>>   SBDebugger debugger = SBDebugger::Create(true);
>>>
>>>   if(!debugger.IsValid()) {
>>>     return 1;
>>>   }
>>>
>>>   SBTarget target = 
>>> debugger.CreateTarget("/home/cynecx/dev/helloWorld/main");
>>>
>>>   if(!target.IsValid()) {
>>>     return 1;
>>>   }
>>>
>>>   SBBreakpoint bp1 = target.BreakpointCreateByLocation(
>>>     "/home/cynecx/dev/helloWorld/main.cpp", 7);
>>>
>>>   if(!bp1.IsValid()) {
>>>     return 1;
>>>   }
>>>
>>>   bp1.SetEnabled(true);
>>>
>>>   const char* args[] = { "/home/cynecx/dev/helloWorld/main", 0 };
>>>   const char* env[] = { 0 };
>>>
>>>   SBLaunchInfo launch_info(args);
>>>   launch_info.SetEnvironmentEntries(env, true);
>>>   launch_info.SetWorkingDirectory("/home/cynecx/dev/helloWorld");
>>>   launch_info.SetLaunchFlags(eLaunchFlagStopAtEntry);
>>>
>>>   SBError error;
>>>   SBProcess process = target.Launch(launch_info, error);
>>>
>>>   if(!process.IsValid() || !error.Success()) {
>>>     return 1;
>>>   }
>>>
>>>   error = process.Continue();
>>>   if(!error.Success()) {
>>>     return 1;
>>>   }
>>>
>>>   while(true) {
>>>     SBEvent event;
>>>     SBListener listener = debugger.GetListener();
>>>
>>>     if(listener.WaitForEvent(6, event)) {
>>>       if(!event.IsValid()) {
>>>         break;
>>>       }
>>>
>>>       const uint32_t event_type = event.GetType();
>>>
>>>       if (!SBProcess::EventIsProcessEvent(event)) {
>>>         continue;
>>>       }
>>>
>>>       if(event_type == SBProcess::eBroadcastBitStateChanged) {
>>>         const StateType state = SBProcess::GetStateFromEvent(event);
>>>
>>>         switch(state) {
>>>           default:
>>>             continue;
>>>           case eStateStopped: {
>>> //            static bool runOnce = false;
>>> //
>>> //            if(runOnce == false) {
>>> //              sleep(1);
>>> //              runOnce = true;
>>> //            }
>>>
>>>             SBThread thread = process.GetThreadAtIndex(0);
>>>             SBStream stream;
>>>
>>>             thread.GetStatus(stream);
>>>             event.GetDescription(stream);
>>>
>>>             std::cout << stream.GetData() << std::endl;
>>>
>>>             auto threadStopReason = thread.GetStopReason();
>>>             if(threadStopReason == eStopReasonBreakpoint) {
>>>               uint64_t bpId = thread.GetStopReasonDataAtIndex(0);
>>>
>>>               if(bpId == static_cast<uint64_t>(bp1.GetID())) {
>>>                 std::cout << "Stopped at breakpoint" << std::endl;
>>>                 thread.StepOver();
>>>               }
>>>             } else if (threadStopReason == eStopReasonPlanComplete) {
>>>               std::cout << "Stopped at step" << std::endl;
>>>             }
>>>
>>>             break;
>>>           }
>>>         }
>>>       } else if (SBProcess::eBroadcastBitSTDOUT) {
>>>         char buffer[1024];
>>>         size_t num_bytes = 0;
>>>         do
>>>         {
>>>           num_bytes = process.GetSTDOUT(buffer, sizeof(buffer));
>>>           if (num_bytes > 0)
>>>             printf("%*s", (int)num_bytes, buffer);
>>>         } while (num_bytes == sizeof(buffer));
>>>       }
>>>
>>>       std::cout << "----------" << std::endl;
>>>     } else {
>>>       break;
>>>     }
>>>   }
>>>
>>>   SBDebugger::Terminate();
>>>
>>>   return 0;
>>> }
>>>
>>> main.cpp:
>>>
>>> #include <cstddef>
>>> #include <cstdint>
>>> #include <iostream>
>>>
>>> int main() {
>>>
>>>   std::cout << "Hello World" << std::endl;
>>>
>>>   int i = 0;
>>>   std::cin >> i;
>>>
>>>   if (i == 1) {
>>>     return 1;
>>>   }
>>>
>>>   return 0;
>>> }
>>>
>>>
>>> So the problem is that I am not getting correct thread information
>>> when receiving an eStateStopped event. It kinda seems that when
>>> "thread.GetStatus(stream);", the thread hasn't stopped yet so I always
>>> getting non-determine thread information.
>>> I found out that on my linux vm, it works properly so I thought it
>>> might be an issue with the kernel and stuff but I kinda found a
>>> workaround by simply putting a sleep(1) before querying the thread
>>> information. As expected it gave me correct thread information, also
>>> the step-over worked properly because the thread plan used correct
>>> line information.
>>>
>>> To compare both outputs:
>>>
>>> Correct one (with sleep(1)):
>>>
>>> * thread #1: tid = 5862, 0x0000000000400953 main`main + 35 at
>>> main.cpp:7, name = 'main', stop reason = breakpoint 1.1
>>>     frame #0: 0x0000000000400953 main`main + 35 at main.cpp:7
>>>    4
>>>    5   int main() {
>>>    6
>>> -> 7    std::cout << "Hello World" << std::endl;
>>>    8
>>>    9    int i = 0;
>>>    10    std::cin >> i;
>>> 0x7f1dc4000930 Event: broadcaster = 0x55da93268068 (lldb.process),
>>> type = 0x00000001 (state-changed), data = { process = 0x55da93268030
>>> (pid = 5862), state = stopped}
>>> ----------
>>> * thread #1: tid = 5862, 0x0000000000400953 main`main + 35 at
>>> main.cpp:7, name = 'main', stop reason = breakpoint 1.1
>>>     frame #0: 0x0000000000400953 main`main + 35 at main.cpp:7
>>>    4
>>>    5   int main() {
>>>    6
>>> -> 7    std::cout << "Hello World" << std::endl;
>>>    8
>>>    9    int i = 0;
>>>    10    std::cin >> i;
>>> 0x7f1dc4001640 Event: broadcaster = 0x55da93268068 (lldb.process),
>>> type = 0x00000001 (state-changed), data = { process = 0x55da93268030
>>> (pid = 5862), state = stopped}
>>> Stopped at breakpoint
>>> ----------
>>> Hello World
>>> ----------
>>> * thread #1: tid = 5862, 0x0000000000400978 main`main + 72 at
>>> main.cpp:9, name = 'main', stop reason = step over
>>>     frame #0: 0x0000000000400978 main`main + 72 at main.cpp:9
>>>    6
>>>    7    std::cout << "Hello World" << std::endl;
>>>    8
>>> -> 9    int i = 0;
>>>    10    std::cin >> i;
>>>    11
>>>    12    if (i == 1) {
>>> 0x7f1dc4003ae0 Event: broadcaster = 0x55da93268068 (lldb.process),
>>> type = 0x00000001 (state-changed), data = { process = 0x55da93268030
>>> (pid = 5862), state = stopped}
>>> Stopped at step
>>> ----------
>>>
>>> And the one with non-determinism:
>>>
>>> * thread #1: tid = 9097, 0x0000000000400830 main`_start, name = 'main'
>>>     frame #0: 0x0000000000400830 main`_start
>>> main`_start:
>>>     0x400830 <+0>: xorl   %ebp, %ebp
>>>     0x400832 <+2>: movq   %rdx, %r9
>>>     0x400835 <+5>: popq   %rsi
>>>     0x400836 <+6>: movq   %rsp, %rdx
>>> 0x7fbdd0000930 Event: broadcaster = 0x564549feffa8 (lldb.process),
>>> type = 0x00000001 (state-changed), data = { process = 0x564549feff70
>>> (pid = 9097), state = stopped}
>>> ----------
>>> * thread #1: tid = 9097, 0x0000000000400830 main`_start, name =
>>> 'main', stop reason = breakpoint 1.1
>>>     frame #0: 0x0000000000400830 main`_start
>>> main`_start:
>>>     0x400830 <+0>: xorl   %ebp, %ebp
>>>     0x400832 <+2>: movq   %rdx, %r9
>>>     0x400835 <+5>: popq   %rsi
>>>     0x400836 <+6>: movq   %rsp, %rdx
>>> 0x7fbdd0001640 Event: broadcaster = 0x564549feffa8 (lldb.process),
>>> type = 0x00000001 (state-changed), data = { process = 0x564549feff70
>>> (pid = 9097), state = stopped}
>>> Stopped at breakpoint
>>> ----------
>>> Hello World
>>> ----------
>>>
>>> 2016-03-03 14:57 GMT+01:00 Pavel Labath <lab...@google.com>:
>>>> Hi Paul,
>>>>
>>>> I haven't followed this discussion from the start, and I am now having
>>>> trouble understanding what is the issue at hand here. Could you just
>>>> briefly repeat what is the problem, and maybe send the code for
>>>> reproducing the problem again? Maybe I'll be able to help...
>>>>
>>>> pl
>>>>
>>>> On 3 March 2016 at 13:04, Paul Peet via lldb-dev
>>>> <lldb-dev@lists.llvm.org> wrote:
>>>>> Sorry to bring this up again, but I am not sure if this is really a
>>>>> linux kernel issue anymore, see the following code:
>>>>>
>>>>> if(event_type == SBProcess::eBroadcastBitStateChanged) {
>>>>>   const StateType state = SBProcess::GetStateFromEvent(event);
>>>>>
>>>>>   switch(state) {
>>>>>     default:
>>>>>       continue;
>>>>>     case eStateStopped: {
>>>>>       static bool runOnce = false;
>>>>>       if(runOnce == false) {
>>>>>         sleep(1); // sleep a second
>>>>>         runOnce = true;
>>>>>       }
>>>>>
>>>>>       SBThread thread = process.GetThreadAtIndex(0);
>>>>>       SBStream stream;
>>>>>
>>>>> As I said before that strangely it worked on the vm with kernel 4.4 so
>>>>> I tried using kernel 4.4 and it still didn't work.
>>>>>
>>>>> Next thing I did was enabling lldb's logging and what I noticed was
>>>>> that when the first thread plan is being made it had wrong instruction
>>>>> information that's probably because the thread was still running. So
>>>>> what I tried was this runOnce with a sleep(1) and the result was as I
>>>>> expected, the thread plan contained the correct instruction
>>>>> information and the following breakpoints and step-overs were
>>>>> correctly made.
>>>>>
>>>>> Any chance that this issue lies deep in lldb? Would the lldb log help
>>>>> to trace back the issue?
>>>>>
>>>>> 2016-02-29 19:58 GMT+01:00 Greg Clayton <gclay...@apple.com>:
>>>>>>
>>>>>>> On Feb 28, 2016, at 2:17 PM, Paul Peet <paulpee...@gmail.com> wrote:
>>>>>>>
>>>>>>> Hey,
>>>>>>>
>>>>>>> Just to let you know that I think I made some progress in determine the 
>>>>>>> problem.
>>>>>>> I've basically setup an vm (archlinux, linux 4.4, lldb 3.7.1) and
>>>>>>> tried the code on it. To my surprise it gave me proper output without
>>>>>>> non-determinism. YEY.
>>>>>>> I still don't have any idea why it's not working on my host system. I
>>>>>>> might try testing linux 4.4 like I did on the vm.
>>>>>>>
>>>>>>> Do you have any idea/suspicion why it might not work on my system. (I
>>>>>>> can provide additional information if needed).
>>>>>>
>>>>>> I don't. Maybe some of the linux experts out there might be able to help 
>>>>>> you. Are are working with top of tree LLDB sources right? You might post 
>>>>>> the exact linux setup you have in case that might allow people to help 
>>>>>> you out...
>>>>>>
>>>>>> Greg
>>>>>>
>>>>>>
>>>>> _______________________________________________
>>>>> lldb-dev mailing list
>>>>> lldb-dev@lists.llvm.org
>>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to