So the crash is coming (on OS X) only in the case where you use:

(lldb) process launch —shell=/bin/bash —

which we implement (as does gdb) by consing up a command like:

/bin/bash exec PROGNAME arg1 arg2 …

and then running that.  So the program exec’s a few times before it gets to the 
executable we are actually trying to debug.  If I don’t do that but just run 
the program directly, then I don’t get this crash.

I temporarily disabled the calling of the GetJITLoader().Did{Attach,Launch} 
till we fix the crash.

Jim

On Mar 5, 2014, at 7:28 PM, Jim Ingham <jing...@apple.com> wrote:

> This part of the patch worries me.  If I am debugging a process that doesn’t 
> have this JIT loader symbol, this bit means every time that the process stops 
> for any reason you will search the whole world for some symbol that won’t be 
> found.  That’s something we really avoid doing if we can, programs get pretty 
> big and this is not the sort of thing you want to do.
> 
> I don’t know how this symbol comes about, is there no event (shared library 
> load or something) that you can hook into to find this symbol?
> 
> This patch is also causing a crash on Mac OS X just running a program.  The 
> crash looks like:
> 
> (lldb) bt
> * thread #8: tid = 0xf68e5, name = <lldb.process.internal-state(pid=40372)>, 
> function: lldb_private::Process::GetTarget() , stop reason = EXC_BAD_ACCESS 
> (code=1, address=0x100)
>     frame #0: 0x0000000106f8072c LLDB`lldb_private::Process::GetTarget() at 
> Process.h:2516
>     frame #1: 0x0000000108e7aa5a 
> LLDB`JITLoaderGDB::GetSymbolAddress(lldb_private::ConstString const&, 
> lldb::SymbolType) const at JITLoaderGDB.cpp:368
>     frame #2: 0x0000000108e7a8bf LLDB`JITLoaderGDB::SetJITBreakpoint() at 
> JITLoaderGDB.cpp:99
>     frame #3: 0x0000000108e7a6d8 
> LLDB`JITLoaderGDB::ProcessStateChangedCallback(void*, lldb_private::Process*, 
> lldb::StateType) at JITLoaderGDB.cpp:354
>     frame #4: 0x0000000108b7b29b 
> LLDB`lldb_private::Process::SynchronouslyNotifyStateChanged(lldb::StateType) 
> at Process.cpp:1223
>     frame #5: 0x0000000108b89762 
> LLDB`lldb_private::Process::ShouldBroadcastEvent(lldb_private::Event*) at 
> Process.cpp:3846
>     frame #6: 0x0000000108b8454d 
> LLDB`lldb_private::Process::HandlePrivateEvent(std::__1::shared_ptr<lldb_private::Event>&)
>  at Process.cpp:4141
>     frame #7: 0x0000000108b8a755 
> LLDB`lldb_private::Process::RunPrivateStateThread() at Process.cpp:4290
>     frame #8: 0x0000000108b89bfd 
> LLDB`lldb_private::Process::PrivateStateThread(void*) at Process.cpp:4221
>     frame #9: 0x00000001087d811a LLDB`ThreadCreateTrampoline(void*) at 
> Host.cpp:629
>     frame #10: 0x00007fff815df899 libsystem_pthread.dylib`_pthread_body
>     frame #11: 0x00007fff815df72a libsystem_pthread.dylib`_pthread_start
>     frame #12: 0x00007fff815e3fc9 libsystem_pthread.dylib`thread_start
> (lldb) f 2
> frame #2: 0x0000000108e7a8bf LLDB`JITLoaderGDB::SetJITBreakpoint() at 
> JITLoaderGDB.cpp:99
>    96                 log->Printf("JITLoaderGDB::%s looking for JIT register 
> hook",
>    97                             __FUNCTION__);
>    98         
> -> 99             addr_t jit_addr = 
> GetSymbolAddress(ConstString("__jit_debug_register_code"),
>    100                                               eSymbolTypeAny);
>    101            if (jit_addr == LLDB_INVALID_ADDRESS)
>    102                return;
> (lldb) expr *this
> (JITLoaderGDB) $13 = {
>   lldb_private::JITLoader = {
>     m_process = 0x0000000000000000 Public: 
> lldb_private::ThreadSafeValue<lldb::StateType> @  Private: 
> lldb_private::ThreadSafeValue<lldb::StateType> @ 
>   }
>   m_jit_objects = size=160215376 {
>     [0] = {
>       first = <parent is NULL>
>       second = <parent is NULL>
>     }
>     ...
>   }
>   m_jit_break_id = 0
>   m_notification_callbacks = {
>     baton = 0x0000000000000001
>     initialize = 0x00007fc54b00f3b0
>     process_state_changed = 0x00000001098cb150 (vtable for 
> std::__1::__shared_ptr_pointer<lldb_private::Section*, 
> std::__1::default_delete<lldb_private::Section>, 
> std::__1::allocator<lldb_private::Section> > + 16)
>   }
> }
> 
> Looks like the JIT instance that is getting passed in is not good for some 
> reason.
> 
> Jim
> 
> 
> On Mar 5, 2014, at 2:12 AM, Andrew MacPherson <andrew.m...@gmail.com> wrote:
> 
>> +void
>> +JITLoaderGDB::ProcessStateChangedCallback(void *baton,
>> +                                          lldb_private::Process *process,
>> +                                          lldb::StateType state)
>> +{
>> +    JITLoaderGDB* instance = static_cast<JITLoaderGDB*>(baton);
>> +
>> +    switch (state)
>> +    {
>> +    case eStateConnected:
>> +    case eStateAttaching:
>> +    case eStateLaunching:
>> +    case eStateInvalid:
>> +    case eStateUnloaded:
>> +    case eStateExited:
>> +    case eStateDetached:
>> +        // instance->Clear(false);
>> +        break;
>> +
>> +    case eStateRunning:
>> +    case eStateStopped:
>> +        // Keep trying to set our JIT breakpoint each time we stop until we
>> +        // succeed
>> +        if (!instance->DidSetJITBreakpoint() && process->IsAlive())
>> +            instance->SetJITBreakpoint();
>> +        break;
>> +
>> +    case eStateStepping:
>> +    case eStateCrashed:
>> +    case eStateSuspended:
>> +        break;
>> +    }
>> +}
>> +
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits@cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

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

Reply via email to