2

ゲッター/セッターを使用して .h ファイルをデバッグしようとしていますが、デバッグしたいプロセスに接続しているときに、特定のメソッドにブレークポイントを配置すると、IDE がブレークポイントをファイル内の別のメソッドに自動的にジャンプさせます。なぜこれが起こっているのか誰にも分かりますか?

私が試したいくつかのこと:

  • デバッグ中の .exe を再構築してリンクする
  • .obj ファイルを削除し、デバッグするファイルを含むディレクトリを作り直します
  • タスク マネージャーでチェックして、正しい .exe が実行されていることを確認しました。
  • .pdb ファイルと .exe ファイルのタイムスタンプをチェックして、それらが (ほぼ) 一致することを確認しました

これはソリューション全体の問題ではありません。これはたまにしか見ません。他に試すことができるものはありますか?

4

1 に答える 1

3

Point クラスと Rectangle クラスを考えてみましょう。Point に GetX() というゲッターがあり、Rectangle に GetLeft() というゲッターがあるとします。マシン命令レベルでは、これらの 2 つのメソッドは、それぞれオブジェクトの最初の 32 ビット値を返すため、同一である可能性があります。

コードが同一であるため、コンパイラーおよび/またはリンカーは、メソッドの 1 つのコピーを破棄し、破棄されたものへのすべての呼び出しを保持されているものへの呼び出しとして解決することにより、バイナリのサイズを減らすことができます。たとえば、リンカーは実行可能ファイルから Rectangle::GetLeft() を削除し、Rect::GetLeft() へのすべての呼び出しを Point::GetX() への呼び出しに置き換える場合があります。

これが発生すると、デバッガーは GetX() と GetLeft() を区別できなくなります。呼び出しが Rect::GetLeft() であったとしても、命令ポインターは Point::GetX() に属するコードの範囲内にあります。スタックを調べて実際に呼び出されたメソッドを確認することで違いがわかりますが、デバッガーはそれを行いません。

通常、この種のデバッグの混乱を避けるために、最適化を無効にしてデバッグ ビルドをビルドします。それは常に可能であるとは限りません。たとえば、最適化されたバイナリを実行していた顧客からのクラッシュ ダンプをデバッグしている可能性があります。その場合、実際に何が起こっているのかを知るには、単に問題を認識し、呼び出しコンテキストを認識している必要があります。

于 2012-08-13T16:22:34.303 に答える