2011-02-18 63 views
0

嗨,我一直在致力於調用dll函數的c#應用程序。 DLL是C代碼,它實際上初始化套接字來讀/寫/操作數據。使用調試信息編譯dll。問題是在某些情況下,c#應用程序會彈出一條消息,說明DLL中的MemoryAccessViolation,但不會顯示任何更多信息。我基本上是一個Linux開發人員,所以我想知道任何機制來調試這樣的問題。如何調試由c#應用程序調用的dll(c代碼)

回答

0

可能有更好的答案,但我會採取一般的路線將是:

  1. 嘗試,並得到它導致對需求的例外。換句話說,確定哪些確切的條件會導致錯誤。這可能需要一些時間。

  2. 在C#代碼中發生的地方嘗試並捕獲異常。如果你幸運的話,那麼這至少可以引導你在#1重複這個問題所需的步驟。

  3. 如果我有權限修改用c寫的dll;添加大量日誌記錄。希望你至少知道這是從哪裏來的。

2

在Visual Studio中的項目屬性,您可以通過點擊Debug選項卡上啓用非託管代碼調試,並選擇該選項(啓用非託管代碼調試)。另外,通過按<ctrl><alt>e(或在Debug菜單下選擇該選項)調出異常對話框,可以讓調試器在非託管代碼發生異常時停止。

0

這裏是一個論壇的帖子有一些提示: http://social.msdn.microsoft.com/Forums/en/netfxcompact/thread/69e84750-6636-4656-bbd4-8d3586290af3

使用VS調試啓動託管代碼如常。現在您需要啓動VS的第二個副本並將其附加到您正在調試的進程中。爲第二個調試器實例選擇本機代碼。現在假設DLL已經被加載(任何已經執行的DLL),你應該可以設置一個斷點。

有時它有助於在本地DLL中顯示消息框,因此執行將停止在您感興趣的位置,您可以附加本地調試器並繼續。

1

在調試選項卡中,設置非託管調試。

如果這沒有幫助,用WinDbg調試它可能是最快的,它應該停止對內存訪問衝突的執行權。

問題是違規行爲可能是發生得更早的行爲的結果。