> On Nov 11, 2014, at 2:44 AM, Mario Zechner <badlogicga...@gmail.com> wrote:
> 
> Hi,
> 
> we are running into a few issues when resolving local variables. The first 
> issue is that sometimes an argument is marked as <unavailable> by LLDB, for 
> example __$env in frame #2 of this backtrace:
> 
> * thread #2: tid = 0xda984, 0x000000010026d464 
> ThreadTest`[J]com.robovm.debug.server.apps.SleeperThread.run(__$env=0x000000010285d280,
>  __$this=0x000000010283a8e0)V + 72 at SleeperThread.java:12, stop reason = 
> breakpoint 1.1
>   * frame #0: 0x000000010026d464 
> ThreadTest`[J]com.robovm.debug.server.apps.SleeperThread.run(__$env=0x000000010285d280,
>  __$this=0x000000010283a8e0)V + 72 at SleeperThread.java:12
>     frame #1: 0x000000010030941e 
> ThreadTest`[j]java.lang.Runnable.run()V[Invokeinterface(java/lang/Thread)] + 
> 9 at Thread.java:1
>     frame #2: 0x0000000100307734 
> ThreadTest`[J]java.lang.Thread.run(__$env=<unavailable>, 
> __$this=0x0000000102817ab0)V + 76 at Thread.java:837
>     frame #3: 0x00000001005bb24e ThreadTest`_call0 + 142 at 
> call0-darwin-x86_64.s:80
>     frame #4: 0x00000001005a181b 
> ThreadTest`callVoidMethod(env=0x000000010285d280, 
> callInfo=0x000000010528cc70) + 155 at method.c:620
>     frame #5: 0x00000001005a12da 
> ThreadTest`rvmCallVoidInstanceMethodA(env=0x000000010285d280, 
> obj=0x0000000102817ab0, method=0x0000000102811320, args=0x000000010528cdd0) + 
> 634 at method.c:759
>     frame #6: 0x00000001005b9d67 
> ThreadTest`startThreadEntryPoint(_args=0x00007fff5fbff3e0) + 391 at 
> thread.c:360
>     frame #7: 0x00000001005d0fc5 
> ThreadTest`GC_inner_start_routine(sb=0x000000010528ceb8, 
> arg=0x0000000102863ed0) + 117 at pthread_start.c:57
>     frame #8: 0x00000001005cdeef 
> ThreadTest`GC_call_with_stack_base(fn=0x00000001005d0f50, 
> arg=0x0000000102863ed0) + 63 at misc.c:1860
>     frame #9: 0x00000001005d243f 
> ThreadTest`GC_start_routine(arg=0x0000000102863ed0) + 31 at 
> pthread_support.c:1666
>     frame #10: 0x00007fff8f66f899 libsystem_pthread.dylib`_pthread_body + 138
>     frame #11: 0x00007fff8f66f72a libsystem_pthread.dylib`_pthread_start + 137
>     frame #12: 0x00007fff8f673fc9 libsystem_pthread.dylib`thread_start + 13
> 
> This is a context struct that gets passed to all functions in this backtrace. 
> While it's not available for inspection in frame #2, it is available in in 
> previous and subsequent frames (to which it gets passed by Thread.run). The 
> argument is kept in rbx and passed to functions via rdi in the x86_64 
> assembler code. Any idea why it is marked as unavailable?

Because the compiler said it was unavailable in the DWARF debug info. DWARF has 
the ability to have a list of address ranges with locations for each range for 
a given variable:

Block [0x1000 - 0x2000)
    Variable "__$env" with variable value locations:
        [0x1000 - 0x1010) - rax
        [0x1020 - 0x1030) - deref(rsp + 10)

So if your function call is within the block [0x1000 - 0x2000) and the PC is 
not within [0x1000 - 0x1010) or [0x1020 - 0x1030), then the variable will be 
displayed as unavailable.

> 
> Related to this, we sometimes get very strange pointer values for arguments. 
> E.g. we have a breakpoint in this function:
> 
> void _rvmHookThreadDetaching(Env* env, JavaThread* threadObj, Thread* thread, 
> Object* throwable) {
>     fprintf(stderr, "[DEBUG] %s: Thread %lld detaching\n", LOG_TAG, 
> threadObj->id);
> } 
> 
> The breakpoint is a symbol breakpoint on _rvmHookThreadDetaching. Some times, 
> threadObj has an invalid value, e.g. 0x3030303030313035, which is an invalid 
> address, and almost seems like a sort of tomb stone value. The fun part is, 
> that once we continue, the fprintf executes just fine, printing the value of 
> threadObj->id, indicating that the inferior is actually using a valid address 
> instead of the 0x3030303030313035 as reported by LLDB. We are also 100% 
> certain that we never pass in an invalid address to this function (the caller 
> goes on to use the threadObj value in subsequent statements, which would 
> explode if the address was invalid).
> 
This is again the compiler not giving you correct variable values in the DWARF. 
Many compilers will say that a variable is at "SP + offset" for a variable that 
is in the function, but that location isn't valid until the stack frame has 
been setup. So in some cases the compiler provides you with too generic of a 
location for a value. In this case the compiler just emits:

Block [0x1000 - 0x2000)
    Variable "__$env" with variable with a single location "SP + offset"

In this case, there is no location list for the variable, so it is assumed to 
be valid for the entire scope in which it exists [0x1000 - 0x2000)...

If you fix the compiler's DWARF debug info, it should fix things. LLDB is only 
as good as the info it is provided.

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

Reply via email to