Stories

Detail Return Return

使用 Windows 調試套件 gflags 解決 CefSharp 加載報錯信息模糊的問題 - Stories Detail

最近寫 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 周邊相關優質技術文,共同進步,一起加油~

user avatar hlinleanring Avatar u_16231477 Avatar donnytab Avatar youqingyouyidedalianmao Avatar jkkang Avatar artificer Avatar Reimual Avatar lradian Avatar kedixa Avatar mrbone11 Avatar goodcitizen Avatar wunima Avatar
Favorites 14 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.