c#应用程序中的非托管调用堆栈

Tom*_*ear 4 c++ debugging pinvoke callstack visual-studio-2010

我在编写的非托管DLL中遇到访问冲突错误,但是当我尝试在ac#应用程序中调试它时,它只会在Visual Studio的调试窗口中获取调用堆栈的最后一帧.

我有debug-> exceptions-> 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();
Run Code Online (Sandbox Code Playgroud)

我希望走上非托管堆栈,看看数据转向garbeldegook的位置.这可能吗?

回答 在此输入图像描述

启用非托管调试是第1步,但为了让我一路走到那里,我启用了微软符号.

这使我的堆栈跟踪看起来更像这样:

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

lin*_*r27 8

是的.您需要在"混合模式"下调试应用程序.右键单击项目,选择"Debug"选项卡并选中"Enable unmanaged code debugging".您将看到托管和本机框架.

混合模式调试

编辑:正如ChrisO提到没有MS符号可以使本机调试怪异.将以下内容添加到Windows符号的符号路径中:http://msdl.microsoft.com/download/symbols