我有一個MSVC 6.o工作區,它具有所有的C代碼。
代碼運行時沒有任何優化開關,即選項O0,並且處於調試模式。 此代碼從一些第三方獲得。它照原樣執行。奇怪的代碼崩潰問題?
但是,當我在某些函數中添加一些printf
語句來調試,然後執行代碼時,它會崩潰。
我懷疑它是某種類型的內存頁/內存段或類似的代碼/數據溢出。但代碼沒有任何內存映射說明符或提及段/內存映射等的鏈接器命令文件。
如何縮小原因並修復這個古怪的問題?
我有一個MSVC 6.o工作區,它具有所有的C代碼。
代碼運行時沒有任何優化開關,即選項O0,並且處於調試模式。 此代碼從一些第三方獲得。它照原樣執行。奇怪的代碼崩潰問題?
但是,當我在某些函數中添加一些printf
語句來調試,然後執行代碼時,它會崩潰。
我懷疑它是某種類型的內存頁/內存段或類似的代碼/數據溢出。但代碼沒有任何內存映射說明符或提及段/內存映射等的鏈接器命令文件。
如何縮小原因並修復這個古怪的問題?
在Linux上,我喜歡valgrind。這是一個Stack Overflow thread for valgrind-like tools on Windows。
在printf中打印cstring對象時使用string.getbuffer。 寬字符和普通字符串可能存在問題。 printf(「%s」,str.Getbuffer()); str.ReleaseBuffer(); 乾杯, Atul。
您可以嘗試通過查看Visual Studio中的堆棧跟蹤來確定發生崩潰的位置。你應該能夠看到最終導致崩潰的函數調用的順序是什麼,這可能會給你一個提示錯誤的提示。
printf()也可能導致崩潰。一個可能的原因 - 但在Windows上不太可能 - 是一個太小的堆棧,正在被printf()調用溢出。
通常,當試圖處理崩潰時,您的第一個端口應該是調試器。
正確使用,這將使您能夠將問題縮小到特定的代碼行,並希望在崩潰時給您一個運行時內存的視圖。這可以讓你看到墜機的直接原因。