5

次のケースでは、Func渡されたポインターを使用して を呼び出していますが、呼び出された関数では、パラメーターはポインター値を完全に偽物として示しています。以下のようなもの。

bool flag = Func(pfspara);--> pfspara = 0x0091d910 

bool Func(PFSPARA pfspara) --> pfspara = 0x00000005
{
    return false;
}

pfsparaが偽のポインタに変わるのはなぜですか? デバッグでは問題を再現できず、本番環境でのみ再現できます。

ありがとう。

4

5 に答える 5

8

たとえばVisualStudioで最適化されたコードをデバッグしようとしている場合、変数の値を正しく表示するデバッガーに常に依存できるとは限りません。特に、変数が使用されていない場合は、コンパイラーが最適化する可能性があります。

代わりにこれを実行してみてください:

bool Func(PFSPARA pfspara)
{
    printf("%x\n", pfspara);
    return false;
}
于 2008-10-18T07:25:50.513 に答える
1

一般的に、これは決して起こらないはずです。このタイプの症状を引き起こす可能性のある問題には、呼び出し元モジュールと呼び出し元モジュール間のコンパイルオプションの非互換性、メンバー関数ポインターの不適切なキャスト、または単にコンパイラーのバグが含まれます。問題についてさらに多くの詳細を提供する必要があります。実際のコードを表示し、コンパイラーを指定し、デバッグと本番のコンパイルフラグを指定します。

于 2008-10-18T07:22:53.857 に答える
0

私にはバッファ オーバーフローの問題のように思えます。何かがその変数を上書きしています。しかし、他の回答で述べたように、実際に作業するコードがなければ確実に判断する方法はありません。

于 2008-10-18T20:35:53.660 に答える
0

Rasmus のコメントに加えて、リリース ビルドだけでなくデバッグ ビルドでも問題が発生するかどうかを一般的に確認する価値があると思います。デバッグ ビルドではなくリリース ビルドで実際の問題が発生している場合は、初期化されていない変数など、最適化プロセスによって明らかになったバグが原因であることがよくあります。ここで発生している問題を回避するために、ほとんどのテストをデバッグ ビルドで実行してから、リリース ビルドを出荷することには、本当に危険があります。IMO、優れた回帰テスト スイート (できれば自動化されたもの) がない場合は、最適化されたコードを出荷することは避けます。

于 2008-10-18T08:29:56.140 に答える
0

スタックに走り書きしているように聞こえます...コードのどこかでスタック上のバ​​ッファがオーバーフローしているか、スタック上のオブジェクトのアドレスを取得して、関数が戻った後にそれに書き込んでいます。これにより、スタックが破損しています。

これはリリース モードでのみ発生する可能性があります。これは、この種の状態のチェックを支援するために使用される「ガード」ブロックの最適化と除外により、スタック割り当てが異なるためです。

于 2008-10-19T12:10:51.667 に答える