优秀的编程知识分享平台

网站首页 > 技术文章 正文

调试C++调用C# DLL产生异常一例(mfc调用c#dll所有变量)

nanyue 2024-08-26 18:08:49 技术文章 5 ℃

近日尝试调用C#写的COM组件dll,别问我为什么转这么大一圈用C++来调C#,技术需要哈哈!

开始一切安好,后来在VS中以调试模式运行过程中发现,只要一调用C#组件的函数,就出现一大堆异常,函数性能还急剧下降:

百思不得其解,因异常被捕捉处理,程序又能正常运行,似乎也没什么。但做为程序员来说,看到异常放过了感觉有点不负责任,不是嘛。但这是C#的DLL,怎么找到原因呢?还好Windows提供有C#的调试插件,Windbg专用,名字叫SOS.dll:

然后在windbg里,加载进程,设置Event Filter中的clr异常属性为Enabled:

然后加载sos.dll:

运行会产生异常的程序,断在异常处:

这时就可以类似C++程序的kb命令一样,使用!clrstack -a命令查看异常时的堆栈:

可以看到System.Diagnostics.ProcessManager.OpenProcess(Int32, Int32, Boolean)的参数为<no data>,就是这里抛了异常,至于为什么,看源代码喽,有可能是没有进程打开权限获取不到句柄导致,实证确实与那片代码写的不严谨有关。

sos.dll里还有很多命令可以使用,感兴趣的可以去微软官网瞧瞧了。

最近发表
标签列表