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

C++ c应用程序中的非托管调用堆栈,c++,visual-studio-2010,debugging,pinvoke,callstack,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 tha

我在正在编写的非托管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。 这可能吗

回答

启用非托管调试是第一步,但为了让我一直做到这一点,我启用了microsoft符号

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

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 symbol服务器加载调试符号,有时调用堆栈看起来很糟糕,除非您这样做。@ChrisO这是一个很好的观点。我将把它添加到答案中。复选框是否启用非托管代码调试?这已经为我设置好了,我可以看到问题发生的帧,但是我看不到从开始到最后一次管理之间发生了什么call@TomFobear您可能还希望启用“首次机会例外”。我还想指出,尽管混合模式调试可能很棘手。调试器在混合模式下有很多问题,因此如果您仍然看到一些奇怪的情况,我会尝试将进程作为本机单独调试,然后作为托管进行调试。我有一个抛出的异常检查:System.AccessViolationException。这使我能够访问dll中访问错误的帧。。但没有比这更重要的了。我已经按照ChrisO的建议加载了微软的符号,但不确定这是否能满足我的要求——这些帧是在我的dll中进行的调用。