2011-08-12 6 views
1

私はパラレル(MPI)c/C++プログラムを使用しており、特定の条件下で時折エラーにつながります。エラーが発生すると、メッセージが出力され、プログラムは終了します。スタックを表示するブレークポイントを設定し、エラーの原因を詳細に説明したいと思います。私は物事をデバッグするためにTotalViewを使用しています。私はエラールーチンの中断点で停止したいと思います。私はいつもこのブレークポイントを自動的にセットアップしたいと思っています。これを行う方法はありますか?Totalview:ブレークポイントをハードコードする方法はありますか?

私はsignal.hを使って調べていますが、それでもTotalViewがどのように応答するかははっきりしていません。

この質問では、How do you stop in TotalView after an MPI Error?を見ると、C++例外処理、つまりthrow()が自動的にTotalViewを停止させるように見えます。 Cでこれを行う正しい方法は何ですか?

答えて

4

>シグナルのメニューオプションは、このウィンドウを開きます:

TotalView Signals Window

これは、呼び出しを信号に応答して、デフォルトの動作を制御することです。 SIGTRAPとSIGSTOPは予約されており、TotalViewはこれらを異なる方法で扱います。つまり、raise(SIGSTOP)はTotalViewで期待どおりに停止しませんでした。

このプログラム:

#include <signal.h> 

main(int argc, char* argv[]) 
{ 
    raise(SIGTRAP); 
} 

はこの応答を生成します:ブレークポイントが原因ではない

予期しない罠!

また、プログラムの状態は「終了または作成されていない」と表示されます。 SIGTRAPをSIGSTOPに置き換えると、同じ結果が発生しますが、 "Unexpected ..."メッセージは表示されません。

上記の画像に示されているように、SIGINT、SIGTSTP、SIGTTIN、およびSIGTTOUは、デフォルトでBreakpointがあるかのようにTotalViewを停止します。デバッグしようとしている場合ダック(Totalview: is there a way to hardcode a break point?)、これらの昇給を()の呼び出しMooingが提供する答えと同様に

は任意に行うことができます。

#ifdef DEBUG 
raise(SIGTSTP) 
#endif 

これは多くの点のひとつでありますおそらくハードコーディングされたブレークポイントの望ましい効果を得るでしょう。

+0

良いキャッチ、あなたがそれを理解してうれしい –

4

私はtotalviewが何であるか分からないので、これは適用できないかもしれません。 Windowsで

__asm int 3; Linuxでは

#define DEBUGME() do{if (IsDebuggerPresent()) DebugBreak();}while(0)
があるかどう継続して実行させる:窓1の場合raise(SIGTRAP);

、私は私が使用して便利なマクロを持っているのx86アセンブリでDebugBreak();
デバッガは接続されていません。 TotalViewの、ファイル内の

+0

これは良い考えで、おそらく動作しますが、* nixシステムでこのコードを実行しています。 TotalViewはデバッガです。 – Yann

+0

x86アセンブリに試してみてください。それは私がLinuxのために見つけることができるすべてです。 –

+0

アセンブリはほとんど動作し、TotalViewはこの "int 3"アセンブリステートメントを内部で使用するために予約していると思われます。私が望むブレークポイントに '__asm __(" int3 ")を含め、コンパイルしてコードを実行すると、私は望みの効果を得られません。コードはブレークポイントで停止しているのは明らかですが、プロセスは実行中とラベル付けされています。ステータスバーには、__dl__debug__stateにあるプログラムの一覧が表示されますが、ソースコードは表示されません。私がプログラムを停止すると、望みの効果が得られ、ブレークポイントにソースコードが表示されます。 – Yann

関連する問題