2012-12-03 5 views
6

これは最近の問題であり、別の2台のコンピューターで発生するような奇妙な気分です。Visual C++ 2010は、デバッグ時にstd :: string値の表示を拒否します。ショー<Bad Ptr>

STLからのstd :: stringの値をデバッグして見てみると、値として表示されます。それは、そのサイズは15であり、容量はいくらか歪んだ膨大な数であると言います。

配列の値そのものがすべてCXX0030と表示されます。Error:式を評価できません。

これは非常にイライラしています。私は文字列のc_strを呼び出してchar *に代入するか、必要に応じてウォッチ式を使用すると、デバッグ中でも文字列値にアクセスできますが、非常に退屈で、複雑な問題を3日間直接デバッグするとき

他のSTLコンテナの内容はうまく表示されます。

これは2台の異なるコンピュータ上の複数のプロジェクトで発生します。私はすべてのデバッグオプションがプロジェクトに設定されていると確信しています。最適化が行われず、確実にデバッグ情報が生成されます。

+2

私たちは、このエラーが発生したいくつかのコンパイルのコードを必要とするこの質問に答えるために。 –

+0

これは何に関係なくすべてのコードで発生します。 std :: stringを使用している場合、デバッガにはと表示されます。 これは私のプロジェクト構成に何らかの問題があり、どこかで最適化が有効になっているか、デバッグシンボルが正しく読み込まれていません。 私はGoogleで検索していますが、答えはまだ見つかりませんでした。 また、より複雑なタイプを簡単にデバッグ可能にするためのデータを視覚化するデバッグであるautoexp.datについても知りました。私はautoexp.datが何とか小さな文字列の最適化を行い、すべての場合に適切に表示すると思います。もう少し詳しく見ていきます。 – iseletsky

+0

const char * test = str.c_str();を使用できます。このステートメントの後に、デバッガが表示する値が使用可能になります。 –

答えて

0

仕事中の小さな文字列の最適化のようなサウンドです。 VS2010は16文字までです。その場合には、文字列の先頭や、容量メンバのポインタはありませんが、その文字列の内容自体にそれらのバイトが使用されます。

+1

Visual Studioのデバッグビジュアライザはそれほど悪くありません。彼らは完全にマイクロソフト自身の最適化を扱うことができ、デフォルトのプロジェクト設定でstd :: stringの長さを正しく表示できます。 – Kirinyale

2

これは、カスタムイテレータのデバッグレベルに関連するMicrosoft-confirmed bug(残念ながら、VS2010では修正されていません)のインスタンスである可能性があります。私はちょうどこの自分自身にぶつかりました、そして、私のテストが示す限り、このバグは、デフォルトの "マルチスレッドデバッグDLL"ランタイム(他のPCでEXEを実行するためにVC redistが必要なもの)を使用して_HAS_ITERATOR_DEBUGGING = 。

それが本当にそうであるならば、(VS2012へのアップグレードの短い)、それを固定する少なくとも2つの方法があります - 両方のテストの結果、私の場合で働い:

1)= 0が定義_HAS_ITERATOR_DEBUGGINGを削除するには。タイムクリティカルなコードでSTLを頻繁に使用している場合、デバッグビルドのパフォーマンスが大幅に低下する可能性があります。そのような定義はデフォルトでは存在しないので、誰かがそれを追加したのは正当な理由(それは私のようなもの)のためだと思います。

2)デバッグ設定を「マルチスレッドデバッグ」ランタイム(つまりリンクCRTを静的に使用)に切り替えます。おそらく、開発と社内デバッグのためにデバッグ設定を使用しているだけなので、問題はありません。リリース構成の共有ランタイムは維持することができます(おそらく、それを正しくデバッグすることはできないため)。

両方の解決策では、すべての依存関係(静的/動的ライブラリ)の対応する設定を調整して再構築する必要があります。そうしないと、もはやリンクできなくなります。

3

同じ問題があり、autoexp.datのビジュアライザを変更して修正しました。 "Visual StudioとWindowsのバージョンによっては、" C:¥Program Files(x86)¥Microsoft Visual Studio 10.0¥Common7¥Packages¥Debugger¥autoexp.dat "またはそれに近い場所にあります。 "STD ::のbasic_string" の

変更:

はsizeof($ e._Bxで$ e._BUF_SIZE

を交換してください。_buf)/はsizeof(文字)

または はsizeof($ e._Bx._Buf)/はsizeof(wchar_t型)

https://connect.microsoft.com/VisualStudio/feedback/details/677683/std-string-incorrectly-displayed-in-debugger

関連する問題