2012-12-08 73 views
2

我需要調試用.NET C#編寫的程序。調試器爲MSIL或在.NET中創建的exe文件C#

具體來說 - 我需要的是看看函數在調用後返回的內容。我發現我可以用於這個目的Microsoft Visual Studio - 它理解IL。我使用ILDASM獲得該exe文件的源代碼。比我得到pdb文件,並使用ILASM從IL代碼獲取exe文件。但是原始的exe文件與我在ILASM之後得到的exe文件不同。

程序啓動,但我有AccessViolationцhen我嘗試執行該功能,我需要看到的結果。程序沒有被混淆。

我做錯了什麼或我需要做什麼才能獲得成功的結果?

回答

3

exe-> il-> exe可能無法正常工作。除了你提到的那個(混淆的IL)之外,還有一個可執行文件也包含本地代碼,或者是一個數字簽名的可執行文件(直接或間接)檢查自己的簽名。

一些調試器可以在不必重新構建應用程序的情況下穿過IL。就我個人而言,我喜歡使用ILSpy。請注意,最新版本的二進制文件不包含調試所需的位,您需要從源代碼構建它。

另一種選擇應該是MDbg:Mike Stall報告已將IL步進添加到GUI back in 2005。我沒有經驗。

0

hvd已經解釋了在執行exe時可能會出錯 - > IL - > exe,我不打算詳談。不過,我會告訴你如何無損檢查一個函數的返回值。首先,你需要啓用本地調試器爲您的項目:

C#應用程序:

enter image description here

ASP.NET:

enter image description here

然後放置一個斷點上的最後一行的方法,打開即時窗口並鍵入(這需要在每個調試會話中執行一次):

.load sos 

然後退出函數(Shift + F11)並複製eax(或rax)註冊表(Debug-> Windows-> Registers)的值。如果你的函數的返回類型是一個值類型(int,byte等),這個值就在你的指尖(你可以將它粘貼到監視窗口把它轉換成十進制值)。如果它是參考值e(r)ax包含堆中對象的地址。爲了查看返回到立即窗口和類型:

做[複製的E(R)AX值]

對象將其所有屬性和字段在立即窗口中顯示。對於字符串,你也可以使用Debug-> Windows-> Memory窗口。

相關問題