Static builds vs. printStackTrace info (was Re: AccessController speedup)

Marco Trudel mtrudel@gmx.ch
Tue Aug 29 06:08:00 GMT 2006


Maybe that has changed in the last 2 months, but back then, it worked if 
you didn't strip the binary (remove "-s"), added debugging support (add 
"-g" and had addr2line in PATH.

But as I said, it might be different now...


Marco


Scott Gilbertson wrote:
> Question: Am I on the right track, diagnosing why no addresses appear in
> stack traces for a static binary?
> 
> Details:
> 
> Andrew Haley wrote:
>> Scott Gilbertson writes:
>>  > The only problem I've seen so far is that exception stack dumps don't
> work
>>  > (static or dynamic).  I'm guessing that's because it needs TLS, which I
>>  > think is problematic on my old glibc.  Does that sound right?
>> That certainly sounds possible.  Strictly speaking, TLS shouldn't be
>> required, but we don't test without it.  A lot of interfaces in libgcj
>> really require unwinding to work.  I'd debug to find out where the
>> problem lies.
>> Andrew.
> 
> Looks like "--disable-tls" is fine, and the remaining problems are specific
> to static builds.
> 
> It appears to have been an observational skills problem on my part.  In
> fact, I'm getting the same traces with and without TLS (and TLS works on my
> old linux now, which is good).  I was thrown off by the absence of
> "call_main" or "run" in the trace, and I see in GetStackTraceElements that
> this is intentional.  I modified my test program to nest a few calls before
> throwing, and the trace shows all the calls both with and without TLS.
> 
> No addresses or line numbers, though -- line numbers work in a dynamic
> executable (with or without TLS), but not static.  I tried
> "-Dgnu.gcj.runtime.NameFinder.show_raw=true" but each entry just says the
> class, method and "Unknown Source".  For my purposes the lack of an address
> may not matter (and I guess trying for line numbers in static builds would
> be pretty ambitious), but I thought I'd look into it anyhow.  The working
> parts (class, method) must require the part that doesn't (raw address from
> the stack frame), so I figured the thing must be basically working, so maybe
> the problem is something simple.
> 
> I did (with show_raw=true, in a class called "Throw"):
>     Throwable tt = new Throwable();
>     tt.fillInStackTrace();
>     StackTraceElement[] ee = tt.getStackTrace();
>     System.out.println ("Object " + tt + ", element: " + ee[0].toString());
> 
> Dynamic build (very nice):
>     Object java.lang.Throwable, element: Throw.main(Throw.java:9)
> Static build (OK, but no addresses or line numbers):
>     Object java.lang.Throwable, element: Throw.main(Unknown Source)
> Stripped static build (same result as when not stripped):
>     Object java.lang.Throwable, element: Throw.main(Unknown Source)
> I would have expected, for static build, something like:
>     Object java.lang.Throwable, element: Throw.main [abcd1234](Unknown
> Source)
> 
> It looks like the only way ee can be non-zero-length is if
> VMThrowable.fillInStackTrace returns a non-zero-length array.  In that case,
> it should have called _Jv_StackTrace::GetStackTraceElements, which should
> have called getLineNumberForFrame, which should have found *lineNum == -1 &&
> NameFinder::showRaw(), so should have added an address to sourceFileName.
> It didn't.
> 
> It's not obvious to me where in that process anything would be sensitive to
> static vs. dynamic builds, except maybe "if (_Jv_platform_dladdr (ip,
> &info))" in _Jv_StackTrace::getLineNumberForFrame, and if that wasn't
> passing I wouldn't get class or method names.  I've got a recent history of
> missing the obvious. Am I missing something that would be obvious if I
> understood this stuff better?
> 
> 



More information about the Java mailing list