2

私は10年のほとんどの間gdbを使用してきましたが、この特定の問題は見たことがありません。gdb 7.4にアップグレードしましたが、問題は解決しません。

RHEL5でCilkマルチスレッドC++アプリケーションをデバッグしています。セグメンテーション違反で実行が停止します。gdbに特定の変数(テンプレート化されたオブジェクトインスタンスへのboost :: intrusive_ptr参照)の値を出力するように依頼すると、gdbは適切な値を出力しますが、非常に短い時間、すべてのスレッドで実行を再開します。デバッグ印刷ステートメントの多くがターミナルにスクロールするため、実行が再開されると思われます(バッファーをクリアするだけではありません---印刷を続行でき、実行を再開し続けます)。この短い継続実行により、追跡している変数の値が変化します。これは、控えめに言っても、デバッグの妨げになります。

メモリリークがあり、スタックが破損していると思われますが、コードでvalgrindを実行しました(初期条件が異なります)。通常のCilkを除いて、デバッグしている主要なサブシステムでメモリリークは表示されません。 -内部リーク。

4

1 に答える 1

1

gdb に特定の変数 (テンプレート化されたオブジェクト インスタンスへの boost::intrusive_ptr 参照) の値を出力するように要求すると、gdb は適切な値を出力しますが、非常に短時間すべてのスレッドで実行を再開します。

これが起こるために私が知っている唯一の方法は、あなたが持っている場合です

  1. タイプ ( boost::intrusive_ptr) および
  2. そのプリティプリンターは、下位​​の (デバッグ中の) プロセスにコールバックします。

たとえば、すべてのプリティプリンターを無効にすることができますdisable pretty-printer。それが役立つ場合は、おそらくどのプリティプリンターがこれを行っているかを正確に把握し、その作成者に連絡する必要があります。

于 2012-08-15T04:10:59.377 に答える