非托管调用堆栈
问题描述:
我得到一个访问冲突错误在非托管的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。 这可能吗?
回答
启用非托管调试步骤1中,但让我都在那里我启用微软符号的方式。
,使我堆栈跟踪看起来更像是这样的:
myunmanaged.dll!ViolatingFunc()
- - - -
myunmanaged.dll!SomeFunc2()
- - - -
myunmanaged.dll!SomeFunc()
- - - -
[managed to unmanaged code transition]
- - - -
somecsharp.exe!com.somewhere.Form1.CallFuncThatCallsViolator();
答
是的。您需要在“混合模式”下调试您的应用程序。右键单击项目,选择“调试”选项卡并选中“启用非托管代码调试”。您将看到托管框架和本机框架。
编辑:由于ChrisO提到了没有MS符号可以使本机调试怪异。以下内容添加到您的符号路径为Windows符号:http://msdl.microsoft.com/download/symbols
它最好加载调试符号为好,从Microsoft符号服务器,有时调用堆栈看起来很糟糕,直到你这样做。 – 2012-01-18 18:45:25
@ChrisO这是一个很好的观点。我会将其添加到答案中。 – linuxuser27 2012-01-18 18:48:18
是否选中“启用非托管代码调试”?已经设置为我,我可以看到哪里发生问题的框架,但我不能看到比最后托管调用 – 2012-01-18 18:48:59