【问题标题】:Application crashed with abort error from _Unwind_Resume应用程序因 _Unwind_Resume 中止错误而崩溃
【发布时间】:2013-02-07 13:34:20
【问题描述】:

调用栈:

#0 0x00007faf7fdb8ed5 in raise () from /lib/libc.so.6
#1 0x00007faf7fdba3f3 in abort () from /lib/libc.so.6
#2 0x00007faf8063c294 in _gnu_cxx::_verbose_terminate_handler () from /usr/lib/libstdc++.so.6
#3 0x00007faf8063a696 in ?? () from /usr/lib/libstdc++.so.6
#4 0x00007faf8063988b in ?? () from /usr/lib/libstdc++.so.6
#5 0x00007faf8063a458 in _gxx_personality_v0 () from /usr/lib/libstdc++.so.6
#6 0x00007faf800eacb3 in ?? () from /lib/libgcc_s.so.1
#7 0x00007faf800ead78 in _Unwind_Resume () from /lib/libgcc_s.so.1
#8 0x0000000000a0ea6c in ~ServletRequest (this=0x7faf60a156c0) at ../myapp/servlets/server.cpp:124
#9 0x00000000009d8be2 in boost::detail::sp_counted_impl_p<MyApp::ServletRequest>::dispose (this=<value optimized out> at /usr/include/boost/checked_delete.hpp:34
#10 0x00000000006f5569 in ~shared_count (this=<value optimized out> at /usr/include/boost/smart_ptr/detail/sp_counted_base_gcc_x86.hpp:145
#11 0x00000000009d4a59 in MyApp::Dispatcher::request (this=0x19413b8, req={px = 0x7faf732dfc70, pn = {pi = 0x7faf732dfb60}}) at /usr/include/boost/smart_ptr/shared_ptr.hpp:169
#12 0x00000000009afd9e in boost::detail::function::void_function_ref_invoker1<MyApp::Dispatcher, void, boost::shared_ptr<MyLib::HTTP::ServerRequest> >::invoke (function_obj_ptr=<value optimized out>, a0=<value optimized out> at ../libtriton/mordor/mordor/http/servlet.h:28
#13 0x0000000000cd2bb3 in boost::function1<void, boost::shared_ptr<MyLib::HTTP::ServerRequest> >::operator() (this=<value optimized out>, a0=<value optimized out> at /usr/include/boost/function/function_template.hpp:1013

任何人都遇到过这个问题,可以解释为什么在_Unwind_Resume中发生了中止?

【问题讨论】:

  • 可能是因为文件 ../trogdor/servlets/server.cpp 第 124 行有问题?看起来像一个未捕获的异常。
  • 没有发现任何明确的未捕获异常。
  • 能否请您显示~ServletRequest 析构函数?以及其中使用的任何变量的声明?
  • 写了一个简单的测试来模拟这个问题:

标签: c++ linux gcc boost stl


【解决方案1】:

写了一个简单的测试来模拟这个问题:

class A {
public:
    typedef boost::shared_ptr<A> ptr;
    A(std::string name = "default") : m_name(name) { }
    void throwInDestor() {
        if (m_name == "throwInDestructor")
            throw 34;
    }
    ~A(){
        throwInDestor();
    };
    void throwName() {
        throw m_name;
    }

    std::string m_name;
};

void callfunc(A::ptr a) {
    a->throwName();
}

void callf1(A::ptr a) {
    A::ptr b(new A("throwInDestructor"));
    callfunc(a);
}

void callf2() {
    A::ptr a(new A("call2"));
    callf1(a);
}

int main() {
    try {
        try {
            callf2();
        } catch (...) {
            std::cout << "inner: " << boost::diagnostic_information(boost::current_exception()) << std::endl;
        }
    } catch (...) {
        std::cout << "outer: " << boost::diagnostic_information(boost::current_exception()) << std::endl;
    }
}

用g++编译,成功重现_Unwind_Resume错误。 通过在class A 的析构函数中捕获异常,可以忽略_Unwind_Resume 错误,见下文:

~A(){
    try {
        throwInDestor();
    } catch (...) {
        std::cout << "A::~A: " << boost::diagnostic_information(boost::current_exception()) << std::endl;
    }
};

std::string 异常被抛出,并在 main 函数中找到了 catch 处理程序。然后在 callf1 中进行清理工作时发生崩溃,而 std::string 异常正在传播到 main 因为第一个异常正在展开和清理工作,但是callf1函数A的析构函数中抛出了int异常。 因此,解决方案可以是在A 的析构函数中立即捕获int 异常,如上所述。

我不知道它为什么有效,但它确实有效。

【讨论】:

  • 在析构函数中抛出异常只是为了模拟_Unwind_Resume abort错误。
  • 我并不想和任何人开玩笑,我只是将我发现并写出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
相关资源
最近更新 更多