2012-03-06 4 views
0

overflow_errorがプロセスで発生しているかどうかを解析できるようにDtraceを書きたいと思っています。 実行中です。私はちょうどこれがstd::overflow_errorとして投げられたエラーであることを知っています。私はDトレースを書く方法について多くのアイディアを持っていません。私は初心者ガイドが必要で、誰かが私にそれを書く方法を知らせることができるなら。私が実行しているプロセス名は、superbug_returnsです。上記のシナリオが起きているかどうかを分析するには、どのようにD-Traceを書くことができますか?私はsolarisに取り組んでいますメモリオーバーフローのDtrace?

答えて

1

デバッガ(dbx)でプログラムを実行するほうがはるかに簡単で、スローされた例外では停止する方が簡単でしょう。

1

私は、これを使ってデバッガを試してみようと思っています。通常は、C++でブレークするコマンドがあります。そのように進む方が簡単です。

DTraceを主張する場合:
数年前、Sunはa whitepaper how to use DTrace with C++を公開しました。

残念なことに例外スロー/ハンドリングがC++ランタイムにあり、内部(非占有)関数呼び出しによって行われるため、そこに記述されているテクニックを「トレース例外」に適用することは自明ではありません。

void __Crun::ex_throw(void*,const __Crun::static_type_info*,void(*)(void*)) 

__1cG__CrunIex_throw6Fpvpkn0AQstatic_type_info_pF1_v_v_ 

が呼び出される:(unmangled /マングル)関数を(異なる名前マングリング方式を使用)SunStudioコンパイルされたコードで一方GCCコンパイルされたコードでは、throw ...__cxa_throw(...)となります。コンパイラのバージョンによって異なります。 SunStudioは過去のある時点で、それらのmanglingスキーム/ C++ランタイムを変更しました。しかし、どちらの場合でも、std::...が引数として渡されるので、特定の例外クラスに対してDTraceを実行したい場合は、2次フィルタリングが必要になります(投げられた例外が本当にあなたのものかどうかを調べるDプローブ述語に興味がある)。あなたは、上記の関数[s]が何であるかを調べて、std::overflowがスローされていることに対応し、それらをフィルタリングする必要があります。
実際のオブジェクトファイルがなければ、それ以上のアドバイスはできません。スタートのために、試してみてください。

GCC:

dtrace -n ' 
    pid<your-process-pid>::__cxa_throw:entry 
    { 
     @exloc[ustack()] = count(); 
    }' 

SunStudio:

dtrace -n ' 
    pid<your-process-pid>::__1cG__CrunIex_throw6Fpvpkn0AQstatic_type_info_pF1_v_v_:entry 
    { 
     @exloc[ustack()] = count(); 
    }' 

のDTraceはあなたに与えます終了し、例外がスローされているあなたのコード(Ctrlキー+ Cでの場所を見つけるために統計)。その後、そこから反復します(argsをダンプして、std::overflowを識別できるかどうか確認し、/arg0 == .../などをプローブに追加してフィルタリングしてください)。

関連する問題