[ https://issues.apache.org/jira/browse/QPID-3364?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Paul Colby updated QPID-3364: ----------------------------- Attachment: Makefile loader.cpp loadee.cpp Attached the sample files mentioned in the issue description, along with a near-trivial Makefile. > Segmentation fault when unloading shared libraries linked with > libqpidmessaging > ------------------------------------------------------------------------------- > > Key: QPID-3364 > URL: https://issues.apache.org/jira/browse/QPID-3364 > Project: Qpid > Issue Type: Bug > Components: C++ Client > Affects Versions: 0.8, 0.10, 0.11 > Environment: Linux version 2.6.32-5-686 (Debian 2.6.32-34squeeze1) > (da...@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Wed May 18 > 07:08:50 UTC 2011 > Linux version 2.6.32-5-amd64 (Debian 2.6.32-34squeeze1) (da...@debian.org) > (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Wed May 18 23:13:22 UTC 2011 > Reporter: Paul Colby > Priority: Minor > Attachments: Makefile, loadee.cpp, loader.cpp > > > Disclaimer: I'm not a dlopen/dlclose expert... I'm perfectly happy to be told > that I don't know what I'm doing! ;) > h3. Basic Description > If I create a shared object (that may or may not implement anything) that > links with libqpidmessaging (ie g++ ... -lqpidmessaging), and then create an > application that dlopen's that library, then dlclose's that library, then > that application will cause a seg-fault, which appears to be in the > libqpidmessaging library itself. > To demonstrate, I have a loadee.cpp file that contains just the following > unimportant code: > {code:title=loadee.cpp|borderStyle=solid} > void foo() { } > {code} > Then I build a loadee.so shared object like: > {noformat} > g++ -g -shared -lqpidmessaging -o loadee.so loadee.cpp > {noformat} > Next I have: > {code:title=loader.cpp|borderStyle=solid} > #include <stdio.h> > #include <stdlib.h> > #include <dlfcn.h> > int main(int c, char *argv[]) { > void *handle = dlopen("./loadee.so", RTLD_LAZY); // segfaults in dlclose > below. > //void *handle = dlopen("./loadee.so", RTLD_NOW); // no segfault. > if (!handle) { > fprintf(stderr, "%s\n", dlerror()); > exit(EXIT_FAILURE); > } > dlclose(handle); > return EXIT_SUCCESS; > } > {code} > Finally I build the loader program like: > {noformat} > g++ -g -rdynamic -o loader loader.cpp -ldl > {noformat} > Now, if I run the resulting loader program, then the program seg-faults in > libqpidmessaging. However, there is no such seg-fault (for me at least), if > I *either* remove the -lqpidmessaging flag from the first g++ command, *or* > change the flopen flags from RTLD_NOW to RTLD_LAZY (as indicated in the code > comments above). > h3. Tested Versions > I've tried this against the 0.8 and 0.10 tags, as well as trunk at r1148263, > with both Autotools and CMake. > h3. GDB > Unfortunately, gdb is not giving me much... very strange. > {noformat} > paul@debian:~/src/simple$ gdb ./loader > GNU gdb (GDB) 7.0.1-debian > Copyright (C) 2009 Free Software Foundation, Inc. > License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> > This is free software: you are free to change and redistribute it. > There is NO WARRANTY, to the extent permitted by law. Type "show copying" > and "show warranty" for details. > This GDB was configured as "i486-linux-gnu". > For bug reporting instructions, please see: > <http://www.gnu.org/software/gdb/bugs/>... > Reading symbols from /home/paul/src/simple/loader...done. > (gdb) run > Starting program: /home/paul/src/simple/loader > [Thread debugging using libthread_db enabled] > Cannot find new threads: generic error > (gdb) bt > Target is executing. > (gdb) bt full > Target is executing. > (gdb) thread apply all bt > Cannot find new threads: generic error > (gdb) > {noformat} > h3. Valgrind > Valgrind is a little more interesting though... > {noformat} > paul@debian:~/src/simple$ valgrind --leak-check=full --show-reachable=yes > ./loader > ==31992== Memcheck, a memory error detector > ==31992== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. > ==31992== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for > copyright info > ==31992== Command: ./loader > ==31992== > ==31992== Jump to the invalid address stated on the next line > ==31992== at 0x0: ??? > ==31992== by 0x41A1687: __cxa_finalize (cxa_finalize.c:56) > ==31992== by 0x46ED0F3: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x473091F: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x401271D: _dl_close_worker (dl-close.c:271) > ==31992== by 0x4013196: _dl_close (dl-close.c:742) > ==31992== by 0x4034CA3: dlclose_doit (dlclose.c:37) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) > ==31992== by 0x4034CD9: dlclose (dlclose.c:48) > ==31992== by 0x8048812: main (loader.cpp:12) > ==31992== Address 0x0 is not stack'd, malloc'd or (recently) free'd > ==31992== > ==31992== > ==31992== Process terminating with default action of signal 11 (SIGSEGV) > ==31992== Bad permissions for mapped region at address 0x0 > ==31992== at 0x0: ??? > ==31992== by 0x41A1687: __cxa_finalize (cxa_finalize.c:56) > ==31992== by 0x46ED0F3: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x473091F: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x401271D: _dl_close_worker (dl-close.c:271) > ==31992== by 0x4013196: _dl_close (dl-close.c:742) > ==31992== by 0x4034CA3: dlclose_doit (dlclose.c:37) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) > ==31992== by 0x4034CD9: dlclose (dlclose.c:48) > ==31992== by 0x8048812: main (loader.cpp:12) > ==31992== > ==31992== HEAP SUMMARY: > ==31992== in use at exit: 17,489 bytes in 85 blocks > ==31992== total heap usage: 1,236 allocs, 1,151 frees, 54,608 bytes > allocated > ==31992== > ==31992== 12 bytes in 1 blocks are still reachable in loss record 1 of 33 > ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) > ==31992== by 0x400486E: local_strdup (dl-load.c:162) > ==31992== by 0x4007080: _dl_map_object (dl-load.c:2175) > ==31992== by 0x4011B25: dl_open_worker (dl-open.c:225) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) > ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) > ==31992== by 0x80487D0: main (loader.cpp:6) > ==31992== > ==31992== 17 bytes in 1 blocks are possibly lost in loss record 2 of 33 > ==31992== at 0x402471C: operator new(unsigned int) > (vg_replace_malloc.c:255) > ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, > unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, > std::allocator<char> >::basic_string(char const*, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x480DBAC: global constructors keyed to Variant.cpp > (Variant.cpp:174) > ==31992== by 0x481A7CC: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) > ==31992== by 0x480ACEF: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 18 bytes in 1 blocks are possibly lost in loss record 3 of 33 > ==31992== at 0x402471C: operator new(unsigned int) > (vg_replace_malloc.c:255) > ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, > unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, > std::allocator<char> >::basic_string(char const*, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x480DBE1: global constructors keyed to Variant.cpp > (Variant.cpp:175) > ==31992== by 0x481A7CC: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) > ==31992== by 0x480ACEF: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 25 bytes in 1 blocks are possibly lost in loss record 4 of 33 > ==31992== at 0x402471C: operator new(unsigned int) > (vg_replace_malloc.c:255) > ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, > unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, > std::allocator<char> >::basic_string(char const*, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x471B2CC: global constructors keyed to OutgoingMessage.cpp > (OutgoingMessage.cpp:44) > ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 25 bytes in 1 blocks are possibly lost in loss record 5 of 33 > ==31992== at 0x402471C: operator new(unsigned int) > (vg_replace_malloc.c:255) > ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, > unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, > std::allocator<char> >::basic_string(char const*, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x4716A4D: global constructors keyed to IncomingMessages.cpp > (IncomingMessages.cpp:299) > ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 31 bytes in 1 blocks are possibly lost in loss record 6 of 33 > ==31992== at 0x402471C: operator new(unsigned int) > (vg_replace_malloc.c:255) > ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, > unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, > std::allocator<char> >::basic_string(char const*, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x471B301: global constructors keyed to OutgoingMessage.cpp > (OutgoingMessage.cpp:45) > ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 31 bytes in 1 blocks are possibly lost in loss record 7 of 33 > ==31992== at 0x402471C: operator new(unsigned int) > (vg_replace_malloc.c:255) > ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, > unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, > std::allocator<char> >::basic_string(char const*, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x4716A82: global constructors keyed to IncomingMessages.cpp > (IncomingMessages.cpp:301) > ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 33 bytes in 1 blocks are possibly lost in loss record 8 of 33 > ==31992== at 0x402471C: operator new(unsigned int) > (vg_replace_malloc.c:255) > ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, > unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, > std::allocator<char> >::basic_string(char const*, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x480DB77: global constructors keyed to Variant.cpp > (Variant.cpp:36) > ==31992== by 0x481A7CC: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) > ==31992== by 0x480ACEF: ??? (in /usr/local/lib/libqpidtypes.so.1.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 36 bytes in 1 blocks are possibly lost in loss record 9 of 33 > ==31992== at 0x402471C: operator new(unsigned int) > (vg_replace_malloc.c:255) > ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, > unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, > std::allocator<char> >::basic_string(char const*, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x471B336: global constructors keyed to OutgoingMessage.cpp > (OutgoingMessage.cpp:46) > ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 36 bytes in 1 blocks are possibly lost in loss record 10 of 33 > ==31992== at 0x402471C: operator new(unsigned int) > (vg_replace_malloc.c:255) > ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, > unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, > std::allocator<char> >::basic_string(char const*, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x4716AB7: global constructors keyed to IncomingMessages.cpp > (IncomingMessages.cpp:302) > ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 41 bytes in 1 blocks are possibly lost in loss record 11 of 33 > ==31992== at 0x402471C: operator new(unsigned int) > (vg_replace_malloc.c:255) > ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, > unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, > std::allocator<char> >::basic_string(char const*, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x471B36B: global constructors keyed to OutgoingMessage.cpp > (OutgoingMessage.cpp:47) > ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 41 bytes in 1 blocks are possibly lost in loss record 12 of 33 > ==31992== at 0x402471C: operator new(unsigned int) > (vg_replace_malloc.c:255) > ==31992== by 0x40D0795: std::string::_Rep::_S_create(unsigned int, > unsigned int, std::allocator<char> const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1493: ??? (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x40D1685: std::basic_string<char, std::char_traits<char>, > std::allocator<char> >::basic_string(char const*, std::allocator<char> > const&) (in /usr/lib/libstdc++.so.6.0.13) > ==31992== by 0x4716AEC: global constructors keyed to IncomingMessages.cpp > (IncomingMessages.cpp:303) > ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 140 bytes in 1 blocks are still reachable in loss record 13 of 33 > ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) > ==31992== by 0x4023FDA: realloc (vg_replace_malloc.c:525) > ==31992== by 0x400A029: _dl_new_object (dl-object.c:169) > ==31992== by 0x40059B7: _dl_map_object_from_fd (dl-load.c:969) > ==31992== by 0x4007133: _dl_map_object (dl-load.c:2240) > ==31992== by 0x4011B25: dl_open_worker (dl-open.c:225) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) > ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) > ==31992== > ==31992== 140 bytes in 1 blocks are still reachable in loss record 14 of 33 > ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) > ==31992== by 0x400C37E: _dl_map_object_deps (dl-deps.c:506) > ==31992== by 0x4011B80: dl_open_worker (dl-open.c:262) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) > ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) > ==31992== by 0x80487D0: main (loader.cpp:6) > ==31992== > ==31992== 308 bytes in 7 blocks are still reachable in loss record 15 of 33 > ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) > ==31992== by 0x4009D51: _dl_lookup_symbol_x (dl-lookup.c:616) > ==31992== by 0x400A845: _dl_relocate_object (dl-machine.h:344) > ==31992== by 0x4011C55: dl_open_worker (dl-open.c:338) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) > ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) > ==31992== by 0x80487D0: main (loader.cpp:6) > ==31992== > ==31992== 331 bytes in 10 blocks are still reachable in loss record 16 of 33 > ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) > ==31992== by 0x400486E: local_strdup (dl-load.c:162) > ==31992== by 0x40073EC: _dl_map_object (dl-load.c:2148) > ==31992== by 0x400CE9B: openaux (dl-deps.c:65) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x400C191: _dl_map_object_deps (dl-deps.c:247) > ==31992== by 0x4011B80: dl_open_worker (dl-open.c:262) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) > ==31992== > ==31992== 331 bytes in 10 blocks are still reachable in loss record 17 of 33 > ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) > ==31992== by 0x400A113: _dl_new_object (dl-object.c:150) > ==31992== by 0x40059B7: _dl_map_object_from_fd (dl-load.c:969) > ==31992== by 0x4007133: _dl_map_object (dl-load.c:2240) > ==31992== by 0x400CE9B: openaux (dl-deps.c:65) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x400C191: _dl_map_object_deps (dl-deps.c:247) > ==31992== by 0x4011B80: dl_open_worker (dl-open.c:262) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 18 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x49ED792: global constructors keyed to DispatchHandle.cpp > (iostream:72) > ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 19 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x4972CA0: global constructors keyed to QueueQueryBody.cpp > (iostream:72) > ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 20 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x495DA00: global constructors keyed to FileRejectBody.cpp > (iostream:72) > ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 21 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x493B660: global constructors keyed to > ClusterConnectionTxStartBody.cpp (iostream:72) > ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 22 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x49B9380: global constructors keyed to AMQFrame.cpp > (iostream:72) > ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 23 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x49947C0: global constructors keyed to FileStageBody.cpp > (iostream:72) > ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 24 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x4924FF0: global constructors keyed to > ClusterInitialStatusBody.cpp (iostream:72) > ==31992== by 0x49FF49C: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x48F7C1B: ??? (in /usr/local/lib/libqpidcommon.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 25 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x47C60D3: global constructors keyed to SessionImpl.cpp > (iostream:72) > ==31992== by 0x47E1C3C: ??? (in /usr/local/lib/libqpidclient.so.2.0.0) > ==31992== by 0x4781B43: ??? (in /usr/local/lib/libqpidclient.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 26 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x47AE9AC: global constructors keyed to Demux.cpp > (iostream:72) > ==31992== by 0x47E1C3C: ??? (in /usr/local/lib/libqpidclient.so.2.0.0) > ==31992== by 0x4781B43: ??? (in /usr/local/lib/libqpidclient.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 27 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x471B352: global constructors keyed to OutgoingMessage.cpp > (OutgoingMessage.cpp:46) > ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 28 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x4705CAB: global constructors keyed to AddressResolution.cpp > (AddressResolution.cpp:101) > ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 520 bytes in 1 blocks are still reachable in loss record 29 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x41A14A0: __new_exitfn (cxa_atexit.c:101) > ==31992== by 0x41A1534: __internal_atexit (cxa_atexit.c:35) > ==31992== by 0x41A15A4: __cxa_atexit (cxa_atexit.c:58) > ==31992== by 0x46ED533: global constructors keyed to Address.cpp > (Address.cpp:35) > ==31992== by 0x47308FC: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x46EA143: ??? (in /usr/local/lib/libqpidmessaging.so.2.0.0) > ==31992== by 0x400DBCB: call_init (dl-init.c:70) > ==31992== by 0x400DCE8: _dl_init (dl-init.c:134) > ==31992== by 0x4011D78: dl_open_worker (dl-open.c:463) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== > ==31992== 544 bytes in 10 blocks are still reachable in loss record 30 of 33 > ==31992== at 0x4023F50: malloc (vg_replace_malloc.c:236) > ==31992== by 0x400C1FE: _dl_map_object_deps (dl-deps.c:470) > ==31992== by 0x4011B80: dl_open_worker (dl-open.c:262) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) > ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) > ==31992== by 0x80487D0: main (loader.cpp:6) > ==31992== > ==31992== 628 bytes in 1 blocks are still reachable in loss record 31 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x4009E52: _dl_new_object (dl-object.c:52) > ==31992== by 0x40059B7: _dl_map_object_from_fd (dl-load.c:969) > ==31992== by 0x4007133: _dl_map_object (dl-load.c:2240) > ==31992== by 0x4011B25: dl_open_worker (dl-open.c:225) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) > ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) > ==31992== by 0x80487D0: main (loader.cpp:6) > ==31992== > ==31992== 2,112 bytes in 11 blocks are still reachable in loss record 32 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x400F247: _dl_check_map_versions (dl-version.c:299) > ==31992== by 0x4011DC8: dl_open_worker (dl-open.c:268) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x403509B: _dlerror_run (dlerror.c:164) > ==31992== by 0x4034B40: dlopen@@GLIBC_2.1 (dlopen.c:88) > ==31992== by 0x80487D0: main (loader.cpp:6) > ==31992== > ==31992== 6,369 bytes in 10 blocks are still reachable in loss record 33 of 33 > ==31992== at 0x402328F: calloc (vg_replace_malloc.c:467) > ==31992== by 0x4009E52: _dl_new_object (dl-object.c:52) > ==31992== by 0x40059B7: _dl_map_object_from_fd (dl-load.c:969) > ==31992== by 0x4007133: _dl_map_object (dl-load.c:2240) > ==31992== by 0x400CE9B: openaux (dl-deps.c:65) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x400C191: _dl_map_object_deps (dl-deps.c:247) > ==31992== by 0x4011B80: dl_open_worker (dl-open.c:262) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== by 0x40115C5: _dl_open (dl-open.c:554) > ==31992== by 0x4034C0A: dlopen_doit (dlopen.c:67) > ==31992== by 0x400D7F5: _dl_catch_error (dl-error.c:178) > ==31992== > ==31992== LEAK SUMMARY: > ==31992== definitely lost: 0 bytes in 0 blocks > ==31992== indirectly lost: 0 bytes in 0 blocks > ==31992== possibly lost: 334 bytes in 11 blocks > ==31992== still reachable: 17,155 bytes in 74 blocks > ==31992== suppressed: 0 bytes in 0 blocks > ==31992== > ==31992== For counts of detected and suppressed errors, rerun with: -v > ==31992== ERROR SUMMARY: 12 errors from 12 contexts (suppressed: 42 from 9) > Segmentation fault > {noformat} > h3. Relevance > The reason I'm bothering to try to understand / fix such a scenario, is > because this is precisely (or at least very close) to what happens with the > PHP binding I've been working on, if the PHP processors completes very > quickly (you can see some background info at > https://issues.apache.org/jira/browse/QPID-3027). > Basically, the PHP plugin is compiled against libqpidmessaging, and the PHP > CLI interpreter dlopen's and then dlclose's my plugin, resulting in the same > segfault, at the same location (though in that case, gdb's backtrace includes > info similar to Valgrind's output above (ie shows the segfault to be in > __cxa_finalize, called within libqpidmessaging)). > If there is anything more I can report, or any tests / experiments worth > carrying out, please let me know! :) -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira --------------------------------------------------------------------- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:dev-subscr...@qpid.apache.org