2010-05-27 166 views
1

我有一個傳統的C++應用程序,它在我們使用makefiles和VS2003的命令行工具構建的最具體的應用程序中。我試圖讓它使用VS2008和MsBuild構建。構建工作正常,但是我遇到了以前從未見過錯誤的錯誤,並且在VS2008的調試器中逐步完成工作只會讓我感到困惑。Wierdness調試Visual Studio C++ 2008

該應用程序鏈接的數靜態庫,其可分爲兩類:一類是相同的應用程序套件的一部分,和那些若干應用程序套件之間共享。

最初,我爲每個靜態庫都有一個.csproj文件,還有兩個.sln文件,一個用於應用程序套件(包括特定於套件的庫),另一個用於非特定於套件的共享庫。共享庫包含在鏈接中,它們的項目不包含在應用程序套件.sln中。

的應用從在共享庫的一個所定義的類實例化的對象。該類有一個包裝鏈接列表的類的成員對象。鏈表類的構造函數將其「head」指針設置爲null。

當我運行應用程序,並嘗試將元素添加到鏈表,我得到一個錯誤 - 頭指針包含值0xCCCCCCCC。所以我使用調試器。並看到奇怪。

當在調試器的當前行是屬於靜態庫源文件,頭指針包含00000000。當我進入構造函數時,我可以看到指針被設置爲該值,並且當我走進類的任何其他方法時,我可以看到頭指針仍然包含0x00000000。但是當我步入應用程序套件.sln中定義的方法時,它包含0xCCCCCCCC。這不像它被覆蓋。它根據我目前正在調試的源文件來回更改。

所以,我包括在應用程序套件的.sln共享庫的項目,現在我看到一個包含0xCCCCCCCC所有的時間頭指針。它看起來像鏈接列表類的構造函數沒有被調用。

所以現在,我完全困惑。有人有主意嗎?

+0

是否啓用了優化來編譯靜態庫?如果代碼是通過優化編譯的(例如/ Ox),則變量的內容可能不正確,或者變量可能完全丟失。這可以解釋爲什麼在單步執行代碼時看到不同的值。如果你真的想調試,不要使用優化標誌。 – Patrick 2010-05-27 20:01:42

回答

5

這是當你混合並用不同版本的CRT頭文件的內置匹配代碼常見事故。 2003年到2008年間有很多變化。例如STL迭代器調試。 RTC功能(運行時錯誤檢查)將是另一個,這是您看到的0xcccccccc值的來源。它的意思是「未初始化的變量」。你看到這個是因爲struct或class的內存佈局不一樣。

您將不得不重建這些庫,並確保它們使用相同的編譯器設置構建。另外請確保不要混合調試和發佈構建版本。

+0

似乎確實如此。我試過從IDE中「重建」,問題依然存在。我用舊的makefile「make clean」,刪除所有的二進制文件,並從IDE做了一個構建,現在事情都很好。 謝謝。 – 2010-05-27 21:57:23