我在编写的非托管 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();
我希望沿着非托管堆栈向上走,看看数据在哪里变成了乱码。
这可能吗?
Answered
启用非托管调试是第一步,但为了让我一路顺利,我启用了微软符号。
这使我的堆栈跟踪看起来更像这样:
myunmanaged.dll!ViolatingFunc()
- - - -
myunmanaged.dll!SomeFunc2()
- - - -
myunmanaged.dll!SomeFunc()
- - - -
[managed to unmanaged code transition]
- - - -
somecsharp.exe!com.somewhere.Form1.CallFuncThatCallsViolator();
是的。您需要在“混合模式”下调试应用程序。右键单击项目,选择“调试”选项卡并选中“启用非托管代码调试”。您将看到托管框架和本机框架。
Edit:正如 ChrisO 提到的,没有 MS 符号会使本机调试变得很奇怪。将以下内容添加到 Windows 符号的符号路径中:http://msdl.microsoft.com/download/symbols
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)