Visual Studio 2005 c ++マルチスレッドプログラムで関数の開始と終了をトレースする簡単な方法は何ですか?
-
04-07-2019 - |
質問
activemq-cpp APIの使用方法が原因で、ActiveMQライブラリで断続的なクラッシュが発生しています。クラッシュに至るまでに呼び出されるすべての関数を観察できれば、問題のデバッグがはるかに簡単になります。 Visual Studio 2005 c ++マルチスレッドプログラムで関数の開始と終了をトレースする簡単な方法はありますか?
事前に感謝します!
解決
トレーサーオブジェクトを使用します。このようなもの:
class Tracer
{
public:
Tracer(const char *functionName) : functionName_(functionName)
{
cout << "Entering function " << functionName_ << endl;
}
~Tracer()
{
cout << "Exiting function " << functionName_ << endl;
}
const char *functionName_;
};
これで、関数の上部にあるTracerオブジェクトをインスタンス化するだけで、自動的に&quot; exiting ...&quot;が出力されます。関数が終了し、デストラクタが呼び出されたとき:
void foo()
{
Tracer t("foo");
...
}
他のヒント
プロセスにデバッガーがアタッチされている間、ソースコードを右クリックして、必要なテキスト(一部のマクロが提供されている場合もあります)で「ブレークポイント-&gt; add TracePoint」を選択できます。
トレースポイントは、実際には「ヒット時」のブレークポイントです。一部のメッセージプリンタ機能のフィールド。実際にプロセスを中断することはありません。私はそれが非常に便利だと感じました:それはあなたが必要とするものを正確に行うマクロ$ FUNCTIONも持っています:それが入っている関数を出力します(デバッグ情報が利用可能であれば...)、そして$ THREADID。
上記のすべてのオプションは便利で役立ちます。しかし、コードに何千もの機能がある場合、マウスでTracePoingを設定することがどのように役立つかはわかりません。
この種のものは、通常のプログラミング作業の一部である必要があります。関数を作成するとき、どのトレースメッセージがデバッグに役立つかを考える必要があります。
セクション(リーダースレッド、ワーカースレッドなど)とさまざまなログレベル(エラー、警告、トレース、詳細など)に追加できる既存のロガーを作成/使用する必要があります。優れたロガーは、パフォーマンスを損なわないように設計する必要があります。これは通常、冗長性を損ないますが、問題の後にダンプできる配列に文字列ポインターを割り当てるなど、ロギングが非常に高速でない限り、通常、複雑な同期の問題を再現できます再現されます。私は通常、完全なトレースを画面にダンプしてデバッグを開始しますが、幸運でバグがこのように再現された場合、すでに十分な情報を持っているのでバグを修正するのは簡単です、問題がなくなると楽しみが始まります。問題を再現します。
実際、デバッグはコードを書くよりも創造的で満足できるものですが、これは私だけです:)。