In addition, the following tests fail on 'make check' which are _NOT_
expected to fail according to the README (I've filtered out the ones that
are expected to fail:
/bin/sh: line 1: 32566 Segmentation fault ${dir}$tst
FAIL: Gtest-exc
/bin/sh: line 1: 32583 Segmentation fault ${dir}$tst
FAIL: Ltest-exc
These aren't C++ exceptions, obviously, but is it a similar mechanism?
- Mark
On 2/15/08 4:25 PM, "Mark Rabkin" <[EMAIL PROTECTED]> wrote:
> Arun,
>
> First, thanks so much for your quick responses -- I really appreciate it.
>
> Thanks for the explanation. Then, when linking just native libunwind, the
> following example dies for me as detailed below. For what it's worth,
> throwing an exception works for me if there's no objects w/ destructors on the
> stack, but fails if a class has one.
>
> Linking things I've tried:
> - putting libstdc++ explicitly on the command line before and after libunwind
> doesn't make a difference (but this probably expected since i'm linking
> libstdc++ as shared).
> - linking -lunwind-x86_64 works for both static and shared in isolation for
> these toy testcases, but gets a lot of unresolved symbol errors when using
> Google Perf Tools.
> - linking both versions (libunwind and libunwind-x86_64) results in the same
> behavior as if libunwind was linked by itself.
>
> The _Unwind_Resume() symbol I have seems to be the one that comes from
> libunwind, as intended:
>
> [EMAIL PROTECTED] /tmp/u]$ nm ./unwind | grep _Unwind_Resume
> 0000000000400ec0 T _Unwind_Resume
> 0000000000400ec0 T __libunwind_Unwind_Resume
>
>
> Example of breakage:
> ---------------------------------------------------------------------
> code (unwind.cpp):
> ---------------------------------------------------------------------
> struct Foo {
> ~Foo() { }
> };
>
> void throw_int() {
> Foo f;
> throw int(5);
> }
>
> int main(int argc, char** argv) {
> try {
> throw_int();
> } catch (...) {
> }
> return 0;
> }
>
>
> $ ./unwind
> Aborted
> $ gdb unwind
> Program received signal SIGABRT, Aborted.
>
> #0 0x0000003bd882f3b0 in raise () from /lib64/libc.so.6
> #1 0x0000003bd8830860 in abort () from /lib64/libc.so.6
> #2 0x0000003bd95bb8c1 in __cxa_get_globals () from /usr/lib64/libstdc++.so.6
> #3 0x0000003bd95bb9b4 in __cxa_get_globals () from /usr/lib64/libstdc++.so.6
> #4 0x0000003bd95bbd07 in __gxx_personality_v0 ()
> from /usr/lib64/libstdc++.so.6
> #5 0x000000000040100b in _Unwind_Resume (exception_object=0x517060)
> at unwind/unwind-internal.h:118
> #6 0x0000000000400e84 in throw_int () at unwind.cpp:7
> #7 0x0000000000400e98 in main (argc=1, argv=0x7ffffffcb818) at unwind.cpp:12
>
> $ ./unwind-shared
>
> Program received signal SIGSEGV, Segmentation fault.
> _x86_64_setcontext () at x86_64/setcontext.S:34
> 34 fldenv (%r8)
>
> #0 _x86_64_setcontext () at x86_64/setcontext.S:34
> #1 0x00002aaaaaab4410 in _ULx86_64_local_resume (as=Variable "as" is not
> available.
> ) at x86_64/Gresume.c:74
> #2 0x00002aaaaaab44f7 in _ULx86_64_resume (cursor=Variable "cursor" is not
> available.
> ) at x86_64/Gresume.c:133
> #3 0x00002aaaaaab075f in _Unwind_RaiseException (exception_object=0x501060)
> at unwind/unwind-internal.h:125
> #4 0x0000003bd95bc23d in __cxa_throw () from /usr/lib64/libstdc++.so.6
> #5 0x00000000004007d6 in throw_int () at unwind.cpp:7
> #6 0x0000000000400808 in main (argc=1, argv=0x7ffffff292c8) at unwind.cpp:12
>
>
> ---------------------------------------------------------------------
> Makefile:
> ---------------------------------------------------------------------
> BINS=unwind unwind-shared unwind64 unwind64-shared
> all: $(BINS)
>
> unwind: unwind.cpp
> g++ -g -o $@ unwind.cpp /home/mrabkin/unwind/lib/libunwind.a
>
> unwind-shared: unwind.cpp
> g++ -g -o $@ unwind.cpp -L/home/mrabkin/unwind/lib -lunwind
>
> unwind64: unwind.cpp
> g++ -g -o $@ unwind.cpp /home/mrabkin/unwind/lib/libunwind-x86_64.a
>
> unwind64-shared: unwind.cpp
> g++ -g -o $@ unwind.cpp -L/home/mrabkin/unwind/lib -lunwind-x86_64
>
> clean:
> rm -f $(BINS)
>
>
>
>
>
>
> On 2/15/08 4:09 PM, "Arun Sharma" <[EMAIL PROTECTED]> wrote:
>
>>
>> * libunwind-x86_64.a is needed mainly for cross platform unwinding. If you're
>> unwinding native, you just need libunwind.a
>>
>> This is explained in libunwind(3) man page.
>> section: CROSS-PLATFORM AND MULTI-PLATFORM UNWINDING
>>
>> * libunwind.a and libgcc_eh.a both define _Unwind_Resume(). Which symbol your
>> code sees may vary depending on the order of linking etc. C++ exception
>> handling seemed to break earlier if we link in the one from libunwind.a. I
>> thought my change had fixed that.
>>
>> This test case works for me after linking with libunwind.so.
>>
>> int main(int argc, char *argv[])
>> {
>> try {
>> throw 20;
>> } catch (int i) {
>> cout << "caught the exception: " << i << endl;
>> }
>> }
>>
>> -Arun
>>
>> On Fri, Feb 15, 2008 at 3:35 PM, Mark Rabkin <[EMAIL PROTECTED]> wrote:
>>> I've done more investigation.
>>>
>>> It was barfing on the most trivial of any exception throws when I link
>>> "libunwind.a" or "libunwind.so". However, stack unrolling after exceptions
>>> seems to work if I link libunwind-x86_64.{a,so} instead. What's the exact
>>> difference between these two versions of the library? I can't find any docs
>>> that detail it, but I've played around with "nm" and it seems to be a lot of
>>> symbol name changes.
>>>
>>> Unfortunately, the google perftools seem to want symbols from libunwind that
>>> aren't present in libunwind-x86_64 (since the names seem to be different, a
>>> lot of changes from UL to U).
>>>
>>> Any hints?
>>>
>>>
>>> - Mark
>>>
>>>
>>>
>>> On 2/15/08 1:30 PM, "Arun Sharma" <[EMAIL PROTECTED]> wrote:
>>>
>>>> On Fri, Feb 15, 2008 at 12:27 PM, Mark Rabkin <[EMAIL PROTECTED]> wrote:
>>>>> Hi Friendly libunwind Devs,
>>>>>
>>>>> I'm trying to get libunwind working on my builds on x86-64 (AMD ~2GHz
>>>>> chips), on Linux 2.6 with GCC 4.1. The reason I'm trying to use
>>>>> libunwind, like probably many others, is to try to use the Google Perf
>>>>> Tools (cpu profiler and TCMalloc).
>>>>>
>>>>> I'm getting programs dumping core when throwing C++ exceptions and there's
>>>>> objects w/ destructors on the stack that has to be unrolled -- the core
>>>>> dump winds up in ""__gxx_ personality_v0" under "_Unwind_Resume". I'll
>>>>> provide a small example w/ a stack trace soon.
>>>>
>>>> This is fixed by:
>>>>
>>>> http://git.kernel.org/gitweb.cgi?p=libs/libunwind/libunwind.git;a=commit;h=
>>>> 31440e9796bb34146372df52ed59c4f68ea5839d
>>>>
>>>> -Arun
>>>>
>>>>
>>>>
>>>
>>
>>
>
>
>
> _______________________________________________
> Libunwind-devel mailing list
> [email protected]
> http://lists.nongnu.org/mailman/listinfo/libunwind-devel
_______________________________________________
Libunwind-devel mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/libunwind-devel