5

Visual Studio 2005 で C++ 混合 (マネージ/アンマネージ) プロジェクトをデバッグしていると、次のようなデバッグ ウォッチから奇妙なデータを取得することがよくあります:
(ところで、変数i_processNameconst std::string &)

代替テキスト http://img175.imageshack.us/img175/3561/43419953av1.jpg

変数は実際には有効なデータを保持していることに注意してください。標準出力に出力すると、出力された文字列は問題ありません。お問い合わせいただきありがとうございます。より単純なタイプのデータ ( ints など) (通常は?) は、正しい値が表示されます。

これはあなたにも起こったことがありますか?

これはデバッグ時の主要な PITA です。そのため、時計に正しいデータを表示させる方法についてのアイデア、またはこれの原因は何ですか?

4

6 に答える 6

1

Aardvark はおそらく正解だと思います。混合モードをコンパイルしているときの記憶が正しければ、コンパイラは C++ コードの多くを CLR で実行されるコードに変換し、その結果、CLR が所有するメモリを変換します。私の推測では、デバッガーは、文字列が保持されている場所 (管理されていないメモリまたは管理されているメモリ) について混乱しています。

于 2010-01-08T05:15:21.140 に答える
1

1 つの考え - std::string の STLPort 実装は、分割バッファー実装を使用します。小さな静的バッファー (14 文字と言いたい) と char 配列へのポインターがあります。格納された文字列の長さに応じて、これらの 1 つが無効になり、もう 1 つが文字列データを含みます。STLPort または同様の実装を使用している場合、文字列ビジュアライザーは間違ったバッファーを参照している可能性があり、これにはたまたまジャンク データが含まれています。

于 2009-05-21T03:36:24.663 に答える
1

autoexp.datカスタム タイプ (STL を含む) のデバッグ表示は、フォルダー内のファイルに依存し<install_path>\Common7\Packages\Debuggerます。自分のファイルがライブラリのバージョンと一致していること、およびこのファイルの古いバージョンが保持されていないことを確認してください (たとえば、アップグレード時)。

他のタイプの独自のビジュアライザーを作成することもできます。詳細については、こちらこちらをご覧ください。これは、複雑なプロジェクトの時間を大幅に節約し、カスタム ビジュアライザーを作成するために (わずかな) 労力を費やすだけの価値があります。

于 2009-02-12T16:18:01.950 に答える
1

はい、デバッガーでこの問題が発生します。私の場合、 Unicode と NonUnicode
に接続されています。

于 2009-02-12T16:24:55.257 に答える
1

デバッグ シンボルが正しくないようです。

モジュールのデバッグ ウィンドウを確認します (メニュー: [デバッグ] > [ウィンドウ])。デバッグ中のモジュールに「シンボルがロードされている」ことを確認してください。[シンボル ステータス] 列に表示されます。リストされているシンボル ファイルが、あるべきだと思うファイルであることを確認します。モジュールを右クリックして、VS がどのようにシンボルをロードしたかについての詳細情報を取得し、再ロードすることもできます。

シンボルの読み込みに問題がある場合は、[ツール] > [オプション] > [デバッグ] > [シンボル] でパスやその他の設定を設定できます。

不適切なコール スタックも、このような問題を引き起こす可能性があります。スタックに「この時点ではスタックが正しくない可能性があります...」のようなエントリがないことを確認してください。そうですか?

また、Visual Studio がビジュアライザーでネイティブ データ型とマネージド データ型を混同していることも奇妙なことかもしれませんが、私はそれを疑っています。スクリーンショットのポップアップは、変数が何であるかをデバッガーが認識しているように見えます。

于 2009-02-12T15:59:39.657 に答える