最近写 CPP 我的项目遇到了一个问题,用了几个工具来解决,这里记录一下,和大家一起探讨。
1. 起因
我的一个 CPP 我的项目的 UI 框架应用的是 CefSharp,UI 层是 C#,而一些模块代码应用的是 CPP,运行报错如下
报错信息是
System.IO.FileLoadException:” 未能加由 ”CefSharp.Core.Runtime.dl” 导入的过程
第一感觉是过程加载某个配置文件或 dll 未胜利,或者动静库版本问题,但错报不进去,而且 VS 的 Debugger 无奈显示更多内容,用 Dependencies 看过程,dll 都是找到了的,那会是什么起因呢?
2. 剖析
通过共事的提醒,应用微软提供的 Windows Debugging Tools 调试套件 gflags.exe
工具,让过程加载过程中的日志能在 VS 的 < 输入 > 报进去,配置如下。在 Image File
中输出残缺过程名,而后选中 Show loader snaps 显示加载器快照,而后重启过程。
而后从新运行,在 VS 的输入中就能够看到过程加载过程中的日志,如下。
在输入中搜 ERROR,能够看到加载哪些 dll 失败、正告等信息,有一些不重要,持续找发现加载的一个 dbghelp.dll 文件后,应用它的一个函数 SymGetSearchPathW
未找到失败,到库目录发现这个文件的工夫比拟老了,这个办法须要在 6.3 以上版本的 dbghelp.dll 文件才提供。
能够应用 dumpbin 命令的 dumpbin dbghelp.dll /EXPORTS
命令看到这个 dll 里并没有这个 SymGetSearchPathW
办法,如下
也能够应用 Dependencies 这个工具来看 dll 中的入口函数,如下
3. 解决
将我的项目的库目录里老版本 dbghelp.dll 删掉,让过程去零碎的库目录里找较新的 dll,而后运行胜利。
4. 复盘
对于过程(也就是 Image File),gflags.exe
的 Show loader snaps 选项开启之后会容许捕捉加载和卸载 dll 的信息,并在调试器控制台中显示这些信息,如果过程中有报错信息也能够一并展现,所以能够用来查找相似于加载卸载动静库报错的问题。这个工具还能够做很多事件,监控内存调配、查看内存泄露等等,十分实用,前面再找个工夫学习一下。
Windows 上的 dumpbin
命令和 linux 下的 ldd
命令,是用来查看动静库信息的,包含可执行文件和动态链接库文件的依赖项。dumpbin
命令能够用来看动静库导出了哪些函数 dumpbin /EXPORTS a.dll
,exe 加载了哪些动静库 dumpbin /IMPORTS a.exe
,查看动态链接库中蕴含哪些函数 dumpbin /ALL /RAWDATA:none a.lib
。另外,这个命令默认是不在 cmd 里,装置了 VS 的话须要在 VS 的开发者命令提醒 Developer Command Prompt 里运行能力找到这个命令。
网上的帖子大多深浅不一,甚至有些前后矛盾,在下的文章都是学习过程中的总结,如果发现错误,欢送留言指出,如果本文帮忙到了你,别忘了点赞反对一下哦,你的点赞是我更新的最大能源!~
PS:本文同步更新于在下博客 Github – SHERlocked93/blog 系列文章中,欢送大家关注我的公众号 CPP 下午茶
,间接搜寻即可增加,继续为大家推送 CPP 以及 CPP 周边相干优质技术文,共同进步,一起加油~