乐趣区

关于c++:记一次使用-Windows-调试套件-gflags-解决-CefSharp-加载报错信息模糊的问题

最近写 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 周边相干优质技术文,共同进步,一起加油~

退出移动版