某处(是的,旧编译器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%)“抛出异常();” - 没有捕获异常,程序冻结,当我尝试使用gdb附加到程序并键入“where”时 - 我看到了:
3。 gcc 4.0.1,gdb 6.3和我无法更新它们。
5. xml ++库(https://developer.gnome.org/libxml++/)
6。嗯,程序使用了很多线程,我甚至不知道他们是如何工作的以及他们完全做了什么(我工作的大项目),但我知道,我不要使用任何可能导致此行为的共享变量或其他内容
5. 嗯,我认为xmlpp析构函数有问题,但我不知道它是什么,我不知道如何跟踪它或如何弄清楚< / p>
更新
我没有找到问题所在,但有时我会遇到一个类似于第一个问题的问题(叹息......):
当调用shared_ptr析构函数时,函数(另一个)结束后就会出现问题。
再次,我附上了这个过程,键入“where”,gdb说:
========================
__kernel_vsyscall()中的0)0xb7fd8430
1)来自/lib/i686/libpthread.so.0的_lll_mutex_lock-wait()中的0xb7d9bece
2)来自/lib/i686/libpthread.so.0的_L_mutex_lock_71()中的0xb7d98500
..不知道这里是什么,我只看到“..在??()”
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?)