我有这个二进制文件因为抛出类型为std:string的异常而崩溃。
从剥离的二进制文件堆栈跟踪:
terminate called after throwing an instance of 'std::string'
*** Aborted at 1309483487 (unix time) try "date -d @1309483487" if you are using GNU date ***
PC: @ 0x3fb0c30155 (unknown)
*** SIGABRT (@0xd54) received by PID 3412 (TID 0x40d03940) from PID 3412; stack trace: ***
@ 0x3fb180de70 (unknown)
@ 0x3fb0c30155 (unknown)
@ 0x3fb0c31bf0 (unknown)
@ 0x2aaaaab80cc4 (unknown)
@ 0x2aaaaab7ee36 (unknown)
@ 0x2aaaaab7ee63 (unknown)
@ 0x2aaaaab7ef4a (unknown)
@ 0x4c2622 XYZ::connect()
@ 0x4c3e0f XYZ::refresh()
@ 0x3fb18062f7 (unknown)
@ 0x3fb0cd1e3d (unknown)
现在问题是,refresh()函数确实尝试捕获std :: string。它看起来像: -
bool XYZ::refresh() {
try {
connect();
} catch (string& s) {
return false;
}
return true;
}
任何想法为什么不被抓住?或者我是否错误地读取了堆栈跟踪?
答案 0 :(得分:4)
也许部分或全部模块都是用-fno-exceptions
编译的?有关如何更改异常行为的详细信息,请参阅http://gcc.gnu.org/onlinedocs/libstdc++/manual/using_exceptions.html。
例如,以下短程序显示"terminate called after throwing an instance of 'std::string'"
if:
foo()
的模块已使用-fno-exceptions
和 foo()
调用抛出类型std::string
的异常的东西(所有其他模块都使用-fexceptions
编译)
#include <string>
#include <iostream>
using namespace std;
int foo();
int main()
{
try {
foo();
}
catch (string& s) {
std::cout << "caught it: \"" << s << "\"" << endl;
}
return 0;
}
请注意,如果我只是使用-fexceptions(g ++的默认值)重新编译foo.cpp
并重新链接,程序将显示:
caught it: "the string exception"
正如所料。
或许某个中间函数的throw规范没有列出std::string
?
例如,这个程序:
#include <string>
#include <iostream>
using namespace std;
int Hunc() throw(int); // can only throw int (?)
int main()
{
try {
Hunc();
}
catch (string& s) {
std::cout << "caught it: \"" << s << "\"" << endl;
}
return 0;
}
int Hunc() throw(int)
{
throw string("the string exception");
}
还显示“抛出'std :: string'实例后调用的终止”。两个示例都在具有MinGW 4.5.1的Windows机器上进行了测试。
答案 1 :(得分:0)
也许你没有重建所有你的源文件,或者你正在运行一个过时的可执行文件。