[lldb-dev] SBTarget::AttachToProcessWithID hangs

Philippe Lavoie via lldb-dev lldb-dev at lists.llvm.org
Thu Sep 17 11:05:05 PDT 2015


Ah! The issue was in my custom Platform's Attach. It is based on PlatformGDB, but it seems I bulldozed through a little too fast.

I was missing a call to Process::HijackProcessEvents before calling Process::Attach

						auto listener = attach_info.GetHijackListener();
						if (listener != nullptr)
							process_sp->HijackProcessEvents(listener.get());

Thanks,
-Philippe

________________________________________
From: Greg Clayton [gclayton at apple.com]
Sent: Thursday, September 17, 2015 1:12 PM
To: Philippe Lavoie
Cc: Jim Ingham; lldb-dev at lists.llvm.org
Subject: Re: [lldb-dev] SBTarget::AttachToProcessWithID hangs

This sounds like you don't have a private state thread running. The private state thread watches for private state changes in Process and promotes them into public state changes as needed. Can you check if Process::PrivateStateThread() is running? This should be triggered by a call to StartPrivateStateThread() in "Error Process::Attach(ProcessAttachInfo &)".

Greg


> On Sep 17, 2015, at 10:02 AM, Philippe Lavoie <philippe.lavoie at octasic.com> wrote:
>
> I am missing the final SetPublicState call.
>
> 1442509021.490000000 Process::SetPrivateState (connected)
> 1442509021.492000000 Process::SetPublicState (state = attaching, restarted = 0)
> 1442509021.627000000 Process::SetPrivateState (stopped)
> 1442509021.628000000 Process::SetPrivateState (stopped) stop_id = 1
>
> ________________________________________
> From: Greg Clayton [gclayton at apple.com]
> Sent: Thursday, September 17, 2015 12:55 PM
> To: Philippe Lavoie
> Cc: Jim Ingham; lldb-dev at lists.llvm.org
> Subject: Re: [lldb-dev] SBTarget::AttachToProcessWithID hangs
>
> Here is the output of attaching to a process with ProcessGDBRemote:
>
> (lldb) log enable lldb state
> (lldb) attach 12406
> Process::SetPublicState (state = attaching, restarted = 0)
> Process::SetPrivateState (stopped)
> Process::SetPrivateState (stopped) stop_id = 1
> Process::SetPublicState (state = stopped, restarted = 0)
> Process 12406 stopped
> * thread #1: tid = 0x6f2673, 0x00007fff99688682 libsystem_kernel.dylib read + 10, stop reason = signal SIGSTOP, queue = com.apple.main-thread
>    frame #0: 0x00007fff99688682 libsystem_kernel.dylib read + 10
> libsystem_kernel.dylib`read:
> ->  0x7fff99688682 <+10>: jae    0x7fff9968868c            ; <+20>
>    0x7fff99688684 <+12>: movq   %rax, %rdi
>    0x7fff99688687 <+15>: jmp    0x7fff99682c78            ; cerror
>    0x7fff9968868c <+20>: retq
>
>
> So we see the public state was set to eStateAttaching and then it was set to eStateStopped. Try this out and let me know what you are seeing.
>
> Greg
>
>
>> On Sep 16, 2015, at 1:41 PM, Philippe Lavoie via lldb-dev <lldb-dev at lists.llvm.org> wrote:
>>
>> It is the AttachToProcessWithID that hangs and never returns, so I cannot use my listener yet.
>>
>> -Philippe
>> ________________________________________
>> From: jingham at apple.com [jingham at apple.com]
>> Sent: Wednesday, September 16, 2015 3:34 PM
>> To: Philippe Lavoie
>> Cc: lldb-dev at lists.llvm.org
>> Subject: Re: [lldb-dev] SBTarget::AttachToProcessWithID hangs
>>
>> Did you try waiting for an event on the listener you've passed to AttachToProcess?  The last event after everything is done should be the notification to the public listener (i.e. your test_listener) that the process you attached to has stopped, and nobody is fetching that.
>>
>> Jim
>>
>>> On Sep 16, 2015, at 11:59 AM, Philippe Lavoie via lldb-dev <lldb-dev at lists.llvm.org> wrote:
>>>
>>>
>>> I am trying to attach to a stopped process on our dsp target using the SBTarget interface but the call hangs.
>>> What I understand is that it is waiting for events on the "lldb.process" broadcaster using the "lldb.Target.Attach.attach.hijack" listener.
>>>
>>> Enabling the logs, I see that the process is attached successfully and that the stop event is generated. It just seems that the event is not seen by the listener.
>>>
>>> 1442428969.321000000 004B9590 Listener::WaitForEventsInternal (timeout = { 00000000 }) for lldb.Target.Attach.attach.hijack
>>> 1442428969.321000000 004BC7F4 Broadcaster("opus.remote")::BroadcastEvent (event_sp = {00A72050 Event: broadcaster = 004BC7F4 (opus.remote), type = 0x00010000, data = <NULL>}, unique =0) hijack = 00000000
>>> 1442428969.341000000 0049AC50 Broadcaster("lldb.target")::BroadcastEvent (event_sp = {00A70C78 Event: broadcaster = 0049AC50 (lldb.target), type = 0x00000002 (modules-loaded), data = {}}, unique =0) hijack = 00000000
>>> 1442428969.341000000 004BC7F4 Broadcaster("opus.remote")::BroadcastEvent (event_sp = {00A723C8 Event: broadcaster = 004BC7F4 (opus.remote), type = 0x00010000, data = <NULL>}, unique =0) hijack = 00000000
>>> 1442428969.450000000 004BC394 Broadcaster("lldb.process.internal_state_broadcaster")::BroadcastEvent (event_sp = {00A723C8 Event: broadcaster = 004BC394 (lldb.process.internal_state_broadcaster), type = 0x00000001, data = { process = 004BC308 (pid = 1), state = stopped}}, unique =0) hijack = 00000000
>>> 1442428969.452000000 004BC42C Listener('lldb.process.internal_state_listener')::AddEvent (event_sp = {00A723C8})
>>> 1442428969.453000000 031CF700 Listener::WaitForEventsInternal (timeout = { 00000000 }) for ProcessOpusRemote::AsyncThread
>>> 1442428969.453000000 004BC42C 'lldb.process.internal_state_listener' Listener::FindNextEventInternal(broadcaster=00000000, broadcaster_names=00000000[0], event_type_mask=0x00000000, remove=1) event 00A723C8
>>> 1442428969.459000000 0309F8D4 Listener::StartListeningForEvents (broadcaster = 004BC5F4, mask = 0x00000020) acquired_mask = 0x00000020 for Communication::SyncronizeWithReadThread
>>> 1442428969.470000000 Process::ShouldBroadcastEvent (00A723C8) => new state: stopped, last broadcast state: stopped - YES
>>> 1442428969.471000000 004BC318 Broadcaster("lldb.process")::BroadcastEvent (event_sp = {00A723C8 Event: broadcaster = 004BC318 (lldb.process), type = 0x00000001(state-changed), data = { process = 004BC308 (pid = 1), state = stopped}}, unique =0) hijack = 00000000
>>> 1442428969.473000000 00402598 Listener('lldb.Debugger')::AddEvent (event_sp = {00A723C8})
>>> 1442428969.474000000 004BC42C Listener::WaitForEventsInternal (timeout = { 00000000 }) for lldb.process.internal_state_listener
>>>
>>> Here's the code I use to attach.
>>>
>>> SBDebugger::Initialize();
>>>
>>> SBDebugger debugger = lldb::SBDebugger::Create(false);
>>> debugger.SetAsync(true);
>>>
>>> const char* categories [] = { "process", "events", 0 };
>>> if (!debugger.EnableLog("lldb", categories))
>>> return -1;
>>>
>>> pid_t pid = 1;
>>>
>>> SBTarget target = debugger.CreateTargetWithFileAndArch(elffile_name, "opus2");
>>>
>>> SBError error;
>>> SBListener listener("test_listener");
>>>
>>> SBProcess process = target.AttachToProcessWithID(listener, pid, error);
>>>
>>> if (!process.IsValid())
>>> {
>>>  ...
>>>
>>>
>>> I would be grateful for any insight on the cause of this behavior.
>>>
>>> Thanks,
>>> -Philippe
>>> _______________________________________________
>>> lldb-dev mailing list
>>> lldb-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>>
>> _______________________________________________
>> lldb-dev mailing list
>> lldb-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
>



More information about the lldb-dev mailing list