近日尝试调用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里还有很多命令可以使用,感兴趣的可以去微软官网瞧瞧了。