どこか (ええ、古いコンパイラ 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」と入力します。次のように表示されます。
- __kernel_vsyscall () の 0xb7fd8430
- /lib/i686/libpthread.so.0 からの _lll_mutex_lock-wait() の 0xb7d9bece
- /lib/i686/libpthread.so.0 からの _L_mutex_lock_71 () の 0xb7d98500
- ??で0xbfbefab8 ()
- ?? で 0x00000000 ()
- ?? で 0x00000000 ()
3. gcc 4.0.1、gdb 6.3、まだ更新できません。
5. xml++ ライブラリ ( https://developer.gnome.org/libxml++/ )
6.プログラムは多くのスレッドを使用します。それらがどのように機能し、何を完全に行うのかさえわかりません (私の仕事での大規模なプロジェクト)。それがこの動作を引き起こす可能性があります
5.まあ、xmlpp デストラクタに何か問題があると思いますが、それが何かはわかりませんし、それを追跡する方法も、それを把握する方法もわかりません
アップデート:
問題がどこにあるかはわかりませんでしたが、最初の問題に似た問題がもう 1 つ発生することがあります (ため息..):
この問題は、関数 (別の関数) が終了した直後に、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) .. in __gthread_mutex_lock
11) .. in __gthread_mutex_lock
12) .. in std::tr1::_Sp_counted_base::release
13) .. in ~shared_count
14) .. in ~shared_ptr
=======================
shared_ptr が壊れているようですね。さらに、std::tr1::shared_ptr を使用すると、boost_shared_ptr.h が使用されることを発見して驚きました (gdb は、wtf と言いましたか?)