AIX:为什么抛出异常会中止多线程代码?
当运行使用 -pthread 编译的代码时抛出 C++ 异常时,我们会中止。
平台:AIX 5.3 技术级别8 编译器:gcc 3.4.6 链接器:AIX 链接器 1.65.2.4
测试代码:
// exception.cpp
#include <iostream>
class MyException
{
public:
MyException(){}
virtual ~MyException(){};
};
void gTest()
{
throw MyException();
}
int main()
{
try
{
gTest();
}
catch(MyException const & ex)
{
std::cout << "exception was caught" << std::endl;
}
return 0;
}
$ g++ exception.cpp
$ ./a.out
exception was caught
$ g++ -pthread exception.cpp
$ ./a.out
terminate called after throwing an instance of 'MyException'
IOT/Abort trap (core dumped)
$ gdb a.out
GNU gdb 6.0
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "powerpc-ibm-aix5.1.0.0"...
(gdb) run
Starting program: /home/leeder/except/a.out
terminate called after throwing an instance of 'MyException'
Program received signal SIGABRT, Aborted.
Switching to Thread 1
0xd0124834 in pthread_kill () from /usr/lib/libpthreads.a(shr_xpg5.o)
(gdb) bt
#0 0xd0124834 in pthread_kill () from /usr/lib/libpthreads.a(shr_xpg5.o)
#1 0xd01242a8 in _p_raise () from /usr/lib/libpthreads.a(shr_xpg5.o)
#2 0xd0359bdc in raise () from /usr/lib/libc.a(shr.o)
#3 0xd03b7efc in abort () from /usr/lib/libc.a(shr.o)
#4 0xd0ca1800 in __gnu_cxx::__verbose_terminate_handler() () at ../../.././libstdc++-v3/libsupc++/vterminate.cc:96
#5 0xd0ca1220 in __cxxabiv1::__terminate(void (*)()) (handler=0)
at ../../.././libstdc++-v3/libsupc++/eh_terminate.cc:43
#6 0xd0ca128c in std::terminate() () at ../../.././libstdc++-v3/libsupc++/eh_terminate.cc:53
#7 0xd0ca7cfc in __cxa_throw (obj=0x200084e8, tinfo=0xffffffff, dest=Cannot access memory at address 0xffffffff
)
at ../../.././libstdc++-v3/libsupc++/eh_throw.cc:80
#8 0x100008dc in gTest() ()
#9 0x100009f0 in main ()
(gdb)
有人见过类似的东西吗?
您认为升级到 gcc 4 有帮助吗?
切换到 IBM 的 xl 编译器怎么样?
谢谢。
We get an abort when a C++ exception is thrown when running code compiled with -pthread.
Platform: AIX 5.3 technical level 8
Compiler: gcc 3.4.6
Linker: AIX linker 1.65.2.4
Test Code:
// exception.cpp
#include <iostream>
class MyException
{
public:
MyException(){}
virtual ~MyException(){};
};
void gTest()
{
throw MyException();
}
int main()
{
try
{
gTest();
}
catch(MyException const & ex)
{
std::cout << "exception was caught" << std::endl;
}
return 0;
}
$ g++ exception.cpp
$ ./a.out
exception was caught
$ g++ -pthread exception.cpp
$ ./a.out
terminate called after throwing an instance of 'MyException'
IOT/Abort trap (core dumped)
$ gdb a.out
GNU gdb 6.0
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "powerpc-ibm-aix5.1.0.0"...
(gdb) run
Starting program: /home/leeder/except/a.out
terminate called after throwing an instance of 'MyException'
Program received signal SIGABRT, Aborted.
Switching to Thread 1
0xd0124834 in pthread_kill () from /usr/lib/libpthreads.a(shr_xpg5.o)
(gdb) bt
#0 0xd0124834 in pthread_kill () from /usr/lib/libpthreads.a(shr_xpg5.o)
#1 0xd01242a8 in _p_raise () from /usr/lib/libpthreads.a(shr_xpg5.o)
#2 0xd0359bdc in raise () from /usr/lib/libc.a(shr.o)
#3 0xd03b7efc in abort () from /usr/lib/libc.a(shr.o)
#4 0xd0ca1800 in __gnu_cxx::__verbose_terminate_handler() () at ../../.././libstdc++-v3/libsupc++/vterminate.cc:96
#5 0xd0ca1220 in __cxxabiv1::__terminate(void (*)()) (handler=0)
at ../../.././libstdc++-v3/libsupc++/eh_terminate.cc:43
#6 0xd0ca128c in std::terminate() () at ../../.././libstdc++-v3/libsupc++/eh_terminate.cc:53
#7 0xd0ca7cfc in __cxa_throw (obj=0x200084e8, tinfo=0xffffffff, dest=Cannot access memory at address 0xffffffff
)
at ../../.././libstdc++-v3/libsupc++/eh_throw.cc:80
#8 0x100008dc in gTest() ()
#9 0x100009f0 in main ()
(gdb)
Has anyone seen anything similar?
Do you think upgrading to gcc 4 would help?
What about switching to IBM's xl compiler?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
在 AIX 上尝试了您的程序:
与 g++ --version
将导致运行时找不到符号 (pthread_mutex_t)
但是,如果您像这样构建它:
工作得很好,达到了预期的效果。
我想这可能是正确的 pthread 库的链接问题。
Tried your program on AIX:
with g++ --version
will result in symbols not found at runtime (pthread_mutex_t)
However if you build it like:
works just fine with expected effects.
I guess this might be a link problem with right pthread libraries.
g++ 4.3.2 似乎可以解决这个问题。 xlC v10 也可以工作。
g++ 4.3.2 seems to work Ok for this problem. Also xlC v10 works.