2012-01-18 407 views
1

我得到一個訪問衝突錯誤在非託管的DLL我寫這封信,但是當我嘗試調試它在C#應用程序只會得到Visual Studio的調試調用堆棧的最後一幀窗口。非託管調用堆棧

我有調試 - >異常 - > System.AccessViolationException設置爲打破調試器,當它被拋出。

myunmanaged.dll!ViolatingFunc() Line 100 + 0xc bytes 
- - - - 
[external code] //myunmanaged.dll!function that I want to see 
- - - - 
somecsharp.exe!com.somewhere.Form1.CallFuncThatCallsViolator(); 

我曾經希望能走上非託管棧,看看數據在哪裏轉到garbeldegook。 這可能嗎?

回答 enter image description here

啓用非託管調試步驟1中,但讓我都在那裏我啓用微軟符號的方式。

,使我堆棧跟蹤看起來更像是這樣的:

myunmanaged.dll!ViolatingFunc() 
- - - - 
myunmanaged.dll!SomeFunc2() 
- - - - 
myunmanaged.dll!SomeFunc() 
- - - - 
[managed to unmanaged code transition] 
- - - - 
somecsharp.exe!com.somewhere.Form1.CallFuncThatCallsViolator(); 

回答

5

是的。您需要在「混合模式」下調試您的應用程序。右鍵單擊項目,選擇「調試」選項卡並選中「啓用非託管代碼調試」。您將看到託管框架和本機框架。

mixed mode debugging

編輯:由於ChrisO提到了沒有MS符號可以使本機調試怪異。以下內容添加到您的符號路徑爲Windows符號:http://msdl.microsoft.com/download/symbols

+1

它最好加載調試符號爲好,從Microsoft符號服務器,有時調用堆棧看起來很糟糕,直到你這樣做。 – 2012-01-18 18:45:25

+0

@ChrisO這是一個很好的觀點。我會將其添加到答案中。 – linuxuser27 2012-01-18 18:48:18

+0

是否選中「啓用非託管代碼調試」?已經設置爲我,我可以看到哪裏發生問題的框架,但我不能看到比最後託管調用 – 2012-01-18 18:48:59