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 デストラクタに何か問題があると思いますが、それが何かはわかりませんし、それを追跡する方法も、それを把握する方法もわかりません

アップデート:

問題がどこにあるかはわかりませんでしたが、最初の問題に似た問題がもう 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 と言いましたか?)

4

0 に答える 0