我有一個傳統的C++應用程序,它在我們使用makefiles和VS2003的命令行工具構建的最具體的應用程序中。我試圖讓它使用VS2008和MsBuild構建。構建工作正常,但是我遇到了以前從未見過錯誤的錯誤,並且在VS2008的調試器中逐步完成工作只會讓我感到困惑。Wierdness調試Visual Studio C++ 2008
該應用程序鏈接的數靜態庫,其可分爲兩類:一類是相同的應用程序套件的一部分,和那些若干應用程序套件之間共享。
最初,我爲每個靜態庫都有一個.csproj文件,還有兩個.sln文件,一個用於應用程序套件(包括特定於套件的庫),另一個用於非特定於套件的共享庫。共享庫包含在鏈接中,它們的項目不包含在應用程序套件.sln中。
的應用從在共享庫的一個所定義的類實例化的對象。該類有一個包裝鏈接列表的類的成員對象。鏈表類的構造函數將其「head」指針設置爲null。
當我運行應用程序,並嘗試將元素添加到鏈表,我得到一個錯誤 - 頭指針包含值0xCCCCCCCC。所以我使用調試器。並看到奇怪。
當在調試器的當前行是屬於靜態庫源文件,頭指針包含00000000。當我進入構造函數時,我可以看到指針被設置爲該值,並且當我走進類的任何其他方法時,我可以看到頭指針仍然包含0x00000000。但是當我步入應用程序套件.sln中定義的方法時,它包含0xCCCCCCCC。這不像它被覆蓋。它根據我目前正在調試的源文件來回更改。
所以,我包括在應用程序套件的.sln共享庫的項目,現在我看到一個包含0xCCCCCCCC所有的時間頭指針。它看起來像鏈接列表類的構造函數沒有被調用。
所以現在,我完全困惑。有人有主意嗎?
是否啓用了優化來編譯靜態庫?如果代碼是通過優化編譯的(例如/ Ox),則變量的內容可能不正確,或者變量可能完全丟失。這可以解釋爲什麼在單步執行代碼時看到不同的值。如果你真的想調試,不要使用優化標誌。 – Patrick 2010-05-27 20:01:42