backtrace() vs. _Unwind_Backtrace()

Andrew Haley aph@redhat.com
Tue Dec 9 09:55:00 GMT 2003


Bryce McKinlay writes:
 > On Dec 9, 2003, at 12:33 AM, Andrew Haley wrote:
 > 
 > > Bryce McKinlay writes:
 > >> On Dec 7, 2003, at 12:21 AM, Andrew Haley wrote:
 > >>
 > >>> I don't want it to sound like I'm opposed to the approach of calling
 > >>> _Unwind_Backtrace() directly.  It sounds quite a clean idea.  
 > >>> However,
 > >>> not every architecture supports DWARF2, and if we have a new
 > >>> architecture for unwinding we need to support those targets too.
 > >>
 > >> The thing is, backtrace() alone doesn't help us much. Without DWARF2,
 > >> we can't find the start of the function, and can't lookup the
 > >> Class/Method. So why bother?
 > >
 > > All we need is a method that maps pc->name.  We know that we can use
 > > addr2line to do that, and we are about to get a demangler that we can
 > > link into libgcj.
 > 
 > It needs to map pc->Class/_Jv_Method, not just a name. Mapping to a
 > name (eg symbol lookup/demangling) is insufficient because
 > different classes, with different privileges, can have the same
 > name. Someone could, for example, name their class
 > java.lang.Whatever and potentially bypass security checks.

Good point.  I think there are ways round this.  Ideally, we'd want
something like addr2line, but instead of returning a name it'd return
an entry point.  I can think of a way to do that.

 > Admittedly this problem only really applies to security checks and
 > not diagnostic stack traces, but I think its better to pursue a
 > solution that works for everything.

Your approach for DWARF 2 targets looks sound to me.

There's an issue with CNI, though: at present the class only sees the
address of the PLT entry of a native method, not the address of the
method itself.  I think we can get around this if we use -Bsymbolic
when linking a shared library.

Andrew.



More information about the Java mailing list