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

时间:2012-01-18 18:39:17

标签: c++ visual-studio-2010 debugging pinvoke callstack

我在编写的非托管DLL中遇到访问冲突错误,但是当我尝试在c#应用程序中调试它时,它只会在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();

我希望走上非托管堆栈,看看数据转向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();

1 个答案:

答案 0 :(得分:6)

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

mixed mode debugging

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