4

私は次のものを持っています:

classA::FuncA()
{
 ... code
   FuncB();
 ... code
}

classA::FuncB(const char *pText)
{
    SelectObject(m_hDC, GetStockObject (  SYSTEM_FONT)); 
    wglUseFontBitmaps(m_hDC, 0, 255, 1000); 
    glListBase(1000); 
    glCallLists(static_cast<GLsizei>(strlen(pText)), GL_UNSIGNED_BYTE, pText); 
}

FuncA のどこでもブレークポイントをヒットできます。FuncB にステップ インしようとすると、ステップ オーバーします。FuncB のブレークポイントを受け入れますが、ヒットすることはありません。FuncB に MessagBox() 呼び出しを配置し​​てメッセージ ボックスを取得できるため、FuncB を実行していることがわかります。

私は、VC6 の大規模な使用から数年離れた後、VS2005 を初めて使用します。VC6 時代から思い出すこのような状況の 1 つは、シンボル情報が利用できない場合です。ただし、この場合、両方の関数が同じファイルにあるため、シンボル情報が正しい必要があります。また、その場合、ブレークポイントを設定することさえできなかったと思います。

ソリューション全体を再構築するなど、ばかげたブードゥーをすべて試しました。

私が見落としている愚かなことは何ですか?

編集: 基本的にインライン化可能である可能性があるというコメントに対応して、FuncB のコードを追加しました。(これは、wglUseFontBitmaps の MSDN からの正確なサンプル コードです [ここにコメントを差し引いたものです])。インライン化が各呼び出しのステップ実行をどのように妨げるかわかりません。

4

5 に答える 5

6

すべてのコンパイラの最適化が無効になっていることを確認してください (/Od)。コンパイラーの最適化により、デバッガーのブレークポイントで問題が発生する可能性があります。

于 2008-11-19T18:07:05.307 に答える
4

何が問題なのかはわかりませんが、逆アセンブルされたコードを確認してみてください。ソースコードと無効化されたビューを VS で切り替えることができます。仕事で IDE を目の前に持っていないので、条件が少しずれている可能性があります。

デバッガーをこのモードにすると、実行中のアセンブリ命令を確認できます。これは、この種の問題を特定するのに役立つ場合があります。通常はデバッグ ビルドではありませんが、コンパイラによって呼び出しが最適化されないことがあります。

于 2008-11-19T18:08:04.430 に答える
0

コードを投稿していただきありがとうございます。これは明らかに私が推測したものではありません。


後世のために、そして物事を明確にするために、私の推測では、(1)関数が1行であり、(2)コンパイラーが関数をインライン化した場合、(3)デバッガーはそれにステップインする方法を知らない可能性があります。この推測は、一部のデバッガーがインラインコードやその他のコンパイラーの最適化に問題があるという事実に依存しています。Visual Studioのデバッガーについては、そのリストに含まれているかどうかを判断するのに十分な知識がありません。

スタブ形式を使用するほとんどのシステムでは、-gを使用すると、GDBのみが使用できる追加のデバッグ情報を使用できます。この追加情報により、GDBでのデバッグがより適切に機能しますが、他のデバッガーがクラッシュしたり、プログラムの読み取りを拒否したりする可能性があります。..。

GCCでは、-gを-Oとともに使用できます。最適化されたコードによって取られたショートカットは、驚くべき結果を生み出すことがあります。宣言した変数の中には、まったく存在しないものもあります。制御の流れは、予期していなかった場所に一時的に移動する可能性があります。一部のステートメントは、一定の結果を計算するか、値がすでに手元にあるために実行されない場合があります。一部のステートメントは、ループから移動されたため、異なる場所で実行される場合があります。

GCCマニュアルには、一部のコンパイラーが、デバッガーがそれに従えなかったために、最適化されたコードでデバッグシンボルを出力することを拒否するという記述がありました。

于 2008-11-19T19:33:59.310 に答える
0

実際、私は同様の問題を抱えていました。プログラムを実行しているときにコードがコンパイルされていないことがわかったので、実行する前にプログラムを「コンパイル」してください。

于 2009-03-16T11:18:30.847 に答える
0

すべてが失敗した場合は、まだ持っていない場合は VS2005 SP1 に更新してみてください...

確かに奇妙に聞こえます!

于 2008-11-19T18:03:20.617 に答える