3

activemq-cpp API の使用方法が原因で、ActiveMQ ライブラリで断続的なクラッシュが発生します。クラッシュに至るまでに呼び出されるすべての関数を観察できれば、問題のデバッグがはるかに簡単になります。Visual Studio 2005 の c++ マルチスレッド プログラムで、関数の開始と終了を簡単に追跡する方法はありますか?

前もって感謝します!

4

3 に答える 3

3

Tracer オブジェクトを使用します。このようなもの:


class Tracer
{
public:
  Tracer(const char *functionName) : functionName_(functionName)
  {
    cout << "Entering function " << functionName_ << endl;
  }

  ~Tracer()
  {
    cout << "Exiting function " << functionName_ << endl;
  }

  const char *functionName_;
};

関数の先頭で Tracer オブジェクトをインスタンス化するだけで、関数が終了してデストラクタが呼び出されると、自動的に "exiting..." が出力されます。


void foo()
{
  Tracer t("foo");
   ...
}
于 2008-10-26T19:54:25.780 に答える
2

上記のすべてのオプションは素晴らしく、あなたを助けることができます. しかし、コードに何千もの関数がある場合、マウスで TracePoing を設定することがどのように役立つかわかりません。
この種のことは、通常のプログラミング作業の一部であるべきです。関数を作成するときは、どのトレース メッセージがデバッグに役立つかを考える必要があります。
セクション(リーダースレッド、ワーカースレッドなど)とさまざまなログレベル(エラー、警告、トレース、詳細など)に吐き出すことができる既存のロガーを作成/使用する必要があります。優れたロガーは、パフォーマンスを損なわないように設計する必要があります。これは通常、冗長性に悪影響を及ぼしますが、複雑な同期の問題は通常、ロギングが非常に高速でない限り再現できます。たとえば、問題の後にダンプできる配列に文字列ポインターを割り当てるなどです。再現されています。私は通常、完全なトレースが画面にダンプされた状態でデバッグを開始します。幸運にもバグがこのように再現された場合、バグを修正するのは簡単なことです。なぜなら、十分な情報が既にあるからです。問題が解決したときに楽しみが始まります。問題を再現します。
実際、デバッグはコードを書くよりも創造的で満足のいくものだと思いますが、これは私だけです:)。

于 2008-10-26T20:53:18.737 に答える
2

デバッガーがプロセスにアタッチされている間、ソース コードを右クリックし、必要なテキストを指定して [ブレークポイント -> トレースポイントを追加] を選択できます (一部のマクロも提供されます)。

トレースポイントは実際には、一部のメッセージ プリンター機能の「ヒット時」フィールドを持つブレークポイントであり、実際にはプロセスを中断しません。私はそれが非常に便利であることを発見しました.それはまた、まさにあなたが必要とすることを行うマクロ $FUNCTION を持っています.

于 2008-10-26T20:04:42.280 に答える