1

某处(是的,旧的编译器 gcc 4.0.1 让我很难过):

typedef std::tr1::shared_ptr<xmlpp::DomParser> PtrDomParser;

这是我的一段代码:

try{
    //here I'm using xml++ library to handle xml

    PtrDomParser parser = cdata_file_to_parser(responseFilePath);
    xmlpp::Document *response = parser->get_document();
    xmlpp::NodeSet nodeSet;
    xmlpp::Node *node;
    xmlpp::Element *root;
    typedef xmlpp::NodeSet::iterator It;

    root = response->get_root_node();

    //... some code ...
    throw Exception(); 
}
catch (const Exception &exc){
    std::cout << "Exception is captured!" << std::endl;
}
catch (...){
    std::cout << "Something else is captured!" << std::endl;
}

有以下事实:

1.并非每次流程到达“throw Exception();”时都会发生这种情况,大多数情况下都会捕获异常。

2.有时当流量达到(确实,100%)“throw Exception();” - 未捕获异常,程序冻结,当我尝试使用 gdb 附加到程序并键入“where”时 - 我看到了:

  1. __kernel_vsyscall() 中的 0xb7fd8430
  2. /lib/i686/libpthread.so.0 中的 _lll_mutex_lock-wait() 中的 0xb7d9bece
  3. /lib/i686/libpthread.so.0 中的 _L_mutex_lock_71 () 中的 0xb7d98500
  4. 0xbfbefab8 在 ?? ()
  5. 0x00000000 在 ?? ()
  6. 0x00000000 在 ?? ()

3. gcc 4.0.1,gdb 6.3,我还不能更新它们。

5.xml ++ 库(https://developer.gnome.org/libxml++/

6.好吧,程序使用了很多线程,我什至不知道它们是如何工作的以及它们完全做什么(我工作的大型项目),但我知道,我不使用任何共享变量或其他东西可能导致这种行为

5.嗯,我觉得xmlpp的析构函数有问题,但是我不知道它是什么,我不知道如何去追踪它或者如何弄清楚它

更新:

我没有发现问题出在哪里,但有时我会遇到一个类似于第一个问题的问题(叹息..):

当调用 shared_ptr 析构函数时,该问题会在函数(另一个)结束后立即发生。

同样,我附加到该过程,输入“where”,gdb 说:

=========================

0) __kernel_vsyscall () 中的 0xb7fd8430

1) 来自 /lib/i686/libpthread.so.0 的 _lll_mutex_lock-wait() 中的 0xb7d9bece

2) 来自/lib/i686/libpthread.so.0的_L_mutex_lock_71()中的0xb7d98500

..不知道这里有什么,我只看到“.. in ?? ()”

10) .. 在 __gthread_mutex_lock

11) .. 在 __gthread_mutex_lock

12) .. 在 std::tr1::_Sp_counted_base::release

13) .. 在 ~shared_count

14) .. 在 ~shared_ptr

========================

好像 shared_ptr 坏了?此外,我惊讶地发现,当我使用 std::tr1::shared_ptr 时,使用了 boost_shared_ptr.h(gdb 这么说,wtf?)

4

0 回答 0