我試圖爲我編寫的C++應用程序生成發佈版本。當您在VS2008中運行應用程序時,應用程序運行正常(調試&版本);但是當您運行可執行文件時,幾乎每次都會崩潰。Visual Studio發佈版本
現在,是否存在黑客行爲,因此我可以將此應用程序作爲獨立應用程序運行,而無需運行所有代碼並查找導致它的錯誤?
在此先感謝。
我試圖爲我編寫的C++應用程序生成發佈版本。當您在VS2008中運行應用程序時,應用程序運行正常(調試&版本);但是當您運行可執行文件時,幾乎每次都會崩潰。Visual Studio發佈版本
現在,是否存在黑客行爲,因此我可以將此應用程序作爲獨立應用程序運行,而無需運行所有代碼並查找導致它的錯誤?
在此先感謝。
總之,沒有。
你將不得不發現錯誤,如果它在VS內工作,那麼我會冒險猜測它是一個計時問題,可能你正在覆蓋共享線程數據,這是不太可能的(儘管仍然可能看到)內部VS作爲其在一個調試環境中運行,它減慢了一點。
如果你想找到你的bug的幫助,然後告訴我們更多。否則,使用調試符號(pdbs)構建您的發行版,將DrWatson安裝爲系統調試器並單獨運行。當它崩潰時,DrWatson將創建一個小型轉儲文件,將其加載到WinDbg(我的最愛)中,並且您將能夠確切地看到錯誤的位置(它甚至會告訴您轉儲包含異常並默認顯示它。您需要在WinDbg中將您的源代碼路徑和路徑添加到您的符號中才能正確執行此操作)。
然後,您還將知道如何在應用程序在現場運行時診斷崩潰。
一種可能性是您的程序使用未初始化的堆數據。從調試器啓動程序啓用NT調試堆,這會導致堆分配器使用填充模式填充新的內存塊,並啓用一些堆檢查。從調試器外部啓動相同的程序會禁用NT調試堆,但如果程序與C運行時的調試版鏈接,則CRT調試堆仍將被啓用。
一個不太可能的可能性是您的程序要求SeDebugPrivilege
設置在其流程標記中。調試器在其進程標記中啓用此特權,這具有副作用,即從調試器啓動的所有程序都會繼承此特權。如果您的程序嘗試使用OpenProcess()
/ReadProcessMemory()
/WriteProcessMemory()
並且不能正確處理錯誤,則可以想象它可能會崩潰。
有幾種可能性。除了已經提到的內容之外,從Visual Studio運行應用程序將在與Visual Studio實例相同的安全上下文中執行。因此,例如,如果您正在使用Vista,那麼如果您嘗試訪問受保護的文件或註冊表,您可能會遇到未處理的安全侵害。
如果您構建一個調試版本並單獨運行,該怎麼辦?它會崩潰嗎?如果是這樣,通常可以從那裏闖入調試器並獲得調用堆棧以查看故障是什麼。
調試版運行良好 – Charles 2009-06-22 00:30:41
從您提供的詳細信息中,聽起來像是可能存在圖書館問題。你在同一臺計算機上運行程序嗎?如果沒有,那麼你也必須爲你的應用程序部署適當的庫。如果您在開發環境之外的同一臺計算機上運行,請確保您的應用程序可以看到相應的庫。
我發現在發行版中進行調試的最佳方式是在發生崩潰時創建崩潰轉儲,然後轉儲允許我在開發計算機上加載調試符號並查明發生了什麼。更多的信息在這裏:http://www.debuginfo.com/articles/effminidumps.html
你也可以在Visual Studio中打開file =>打開.exe,所以你不是在調試器本身下面啓動它。不知道它是否會有所幫助。
我們跑在調試模式下的舊的C++應用程序在我們的客戶站點超過6年之前,我們終於找到了錯誤。單個字節在緩衝區溢出,在調試模式下,由於某種原因它從來沒有出現問題。 – 2010-09-09 02:51:22
原因是調試模式用4個字節的「保護頁」填充所有內存分配,因此可以很容易地找到緩衝區溢出。 http://stackoverflow.com/questions/127386/in-visual-studio-c-what-are-the-memory-allocation-representations – gbjbaanb 2010-09-09 11:36:36