2012-12-03 45 views
6

我有一種奇怪的感覺,這是最近的一個問題,發生在兩臺獨立的電腦上。Visual C++ 2010在調試時拒絕顯示std :: string值。顯示<Bad Ptr>

當我在調試並試圖從STL中查看std :: string的值時,它顯示爲值。它說它的大小是15,容量是一些亂碼。

數組值本身都說CXX0030:錯誤:無法評估表達式。

這是非常令人沮喪的,我仍然可以在調試時訪問字符串值,如果我在字符串上調用c_str並將其賦值給char *或者如果需要的話可以使用監視表達式,但是這非常乏味並且會讓生活變得很困難當連續3天調試複雜問題時。

其他STL容器的內容顯示正常。

這發生在兩個不同的計算機上的多個項目,我敢肯定,我有所有的項目設置調試選項。沒有優化,並確保生成調試信息。

+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中未修復)的實例。我剛剛碰到了這個,就我的測試顯示,這個bug是由於在使用默認的「Multithreaded Debug DLL」運行時(需要VC redist來在其他PC上運行你的exe)運行時定義_HAS_ITERATOR_DEBUGGING = 0引起的, 。

如果真是這樣的話,則至少有2種方式將其固定(短升級到VS2012的) - 兩個測試,並在我的情況的工作:

1)拆下_HAS_ITERATOR_DEBUGGING = 0定義。如果您在時間關鍵型代碼中大量使用STL,這可能會顯着降低調試版本的性能。因爲這樣的定義不是默認存在的,所以我認爲無論誰添加它都是有原因的(就像我一樣)。

2)將您的調試配置切換爲使用「Multithreaded Debug」運行時(即靜態鏈接CRT)。由於您可能只使用調試配置進行開發和內部調試,因此這不會導致任何問題。您可以保留共享運行時的配置版本(因爲您可能無法正確調試它)。

請注意,這兩種解決方案還需要調整所有依賴項(靜態/動態庫)中的相應設置並重建它們,否則您將無法再鏈接到它們。

3

有相同的問題,並通過更改autoexp.dat中的可視化器來修復它。在這裏找到它: 「C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ Packages \ Debugger \ autoexp.dat」或類似的地方取決於您的Visual Studio和Windows版本。

更改爲 「的std :: basic_string的」:

替換$ e._BUF_SIZE

由 的sizeof($ e._Bx。_Buf)/的sizeof(char)的

或 的sizeof($ e._Bx._Buf)/的sizeof(wchar_t的)

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

相關問題