2009-06-22 219 views
0

我試圖爲我編寫的C++應用程序生成發佈版本。當您在VS2008中運行應用程序時,應用程序運行正常(調試&版本);但是當您運行可執行文件時,幾乎每次都會崩潰。Visual Studio發佈版本

現在,是否存在黑客行爲,因此我可以將此應用程序作爲獨立應用程序運行,而無需運行所有代碼並查找導致它的錯誤?

在此先感謝。

回答

6

總之,沒有。

你將不得不發現錯誤,如果它在VS內工作,那麼我會冒險猜測它是一個計時問題,可能你正在覆蓋共享線程數據,這是不太可能的(儘管仍然可能看到)內部VS作爲其在一個調試環境中運行,它減慢了一點。

如果你想找到你的bug的幫助,然後告訴我們更多。否則,使用調試符號(pdbs)構建您的發行版,將DrWatson安裝爲系統調試器並單獨運行。當它崩潰時,DrWatson將創建一個小型轉儲文件,將其加載到WinDbg(我的最愛)中,並且您將能夠確切地看到錯誤的位置(它甚至會告訴您轉儲包含異常並默認顯示它。您需要在WinDbg中將您的源代碼路徑和路徑添加到您的符號中才能正確執行此操作)。

然後,您還將知道如何在應用程序在現場運行時診斷崩潰。

+0

我們跑在調試模式下的舊的C++應用程序在我們的客戶站點超過6年之前,我們終於找到了錯誤。單個字節在緩衝區溢出,在調試模式下,由於某種原因它從來沒有出現問題。 – 2010-09-09 02:51:22

+0

原因是調試模式用4個字節的「保護頁」填充所有內存分配,因此可以很容易地找到緩衝區溢出。 http://stackoverflow.com/questions/127386/in-visual-studio-c-what-are-the-memory-allocation-representations – gbjbaanb 2010-09-09 11:36:36

1

您是否正在加載外部資源?如果您在C++程序中檢查您的相對路徑是否正確。

+0

相對路徑是正確的。 – Charles 2009-06-22 00:25:10

1

一種可能性是您的程序使用未初始化的堆數據。從調試器啓動程序啓用NT調試堆,這會導致堆分配器使用填充模式填充新的內存塊,並啓用一些堆檢查。從調試器外部啓動相同的程序會禁用NT調試堆,但如果程序與C運行時的調試版鏈接,則CRT調試堆仍將被啓用。

一個不太可能的可能性是您的程序要求SeDebugPrivilege設置在其流程標記中。調試器在其進程標記中啓用此特權,這具有副作用,即從調試器啓動的所有程序都會繼承此特權。如果您的程序嘗試使用OpenProcess()/ReadProcessMemory()/WriteProcessMemory()並且不能正確處理錯誤,則可以想象它可能會崩潰。

0

有幾種可能性。除了已經提到的內容之外,從Visual Studio運行應用程序將在與Visual Studio實例相同的安全上下文中執行。因此,例如,如果您正在使用Vista,那麼如果您嘗試訪問受保護的文件或註冊表,您可能會遇到未處理的安全侵害。

如果您構建一個調試版本並單獨運行,該怎麼辦?它會崩潰嗎?如果是這樣,通常可以從那裏闖入調試器並獲得調用堆棧以查看故障是什麼。

+0

調試版運行良好 – Charles 2009-06-22 00:30:41

0

從您提供的詳細信息中,聽起來像是可能存在圖書館問題。你在同一臺計算機上運行程序嗎?如果沒有,那麼你也必須爲你的應用程序部署適當的庫。如果您在開發環境之外的同一臺計算機上運行,​​請確保您的應用程序可以看到相應的庫。

相關問題