原 PInvoke導致棧破壞

2022-03-26 17:34:47 字數 909 閱讀 7254

原, 總結, 除錯, 除錯案例

專案中遇到乙個詭異的問題,程式在公升級到.net4.6.1後會崩潰,提示訪問唯讀記憶體區。大概現象如下:

debug版不崩潰,release版穩定崩潰。

只有x64位的程式崩潰,32位及anycpu編譯出來的程式執行不會崩潰。

出問題的**範圍很小

以上資訊,各位有什麼想法呢?

由於release版可以穩定重現,而且範圍不大,故通過二分排除法很快定位到了導致問題的**。

最後發現並不是由於公升級.net版本導致的,而是程式本身的問題: x64下memorystatus結構體中的成員有些不是4位元組大小,而是8位元組大小了。而我們的**依然按4位元組定義的。

我寫了乙個模擬程式來模擬出問題的**。 參見後面的**。

總結: 如果不是那麼穩定的崩潰,恐怕解決這個問題還會花些時間的吧,how lucky i am!!!

btw: 啟用託管除錯助手(mda)有時候會對除錯問題有極大的幫助,雖然我這次除錯沒有借助mda,但我第乙個想到的就是mda。

完整的測試**如下(如想重現問題,請編譯x64版本)

using system.runtime.interopservices; 

namespace

[dllimport("kernel32.dll")] 

public

static

extern

void

globalmemorystatus(ref memorystatus memorystatus); 

class

cmyclass

struct cmystruct 

static

void

main(string args)

", myobj.data); 

} } 

查棧破壞的方法

對於棧破壞,對很多程式設計師來說是一種幽靈,它的產生的core檔案的,每一次的不停變化,就像乙個高手殺手一樣,你破案的時候,前後的線索的都發生的了變化,每一次的覺得正常的,但是core了甚至發在在malloc free的地方。這一有一道好的用的方法。ranqd add 返回位址效驗巨集 define...

不破壞原加密儲存的儲存解密

解密儲存過程 sql2000大於40000的 alter procedure sp decrypt objectname varchar 50 asbegin begin transaction add by playyuer declare objectname1 varchar 100 decl...

gdb 棧破壞 暫存器

優化的 在printf或其它glibc函式處core 沒有檢查返回值的函式呼叫異常導致的異常 優化的 的計算異常的中間過程分析 棧溢位導致的core 區域性變數越界導致棧異常的core 通常除錯的 基本上都是在未開啟優化的情況下,各個變數都可以直接檢視,因此造成很多人除錯時基本上不會看暫存器,但是對...