首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

自製調試診斷工具系列(一):DLL 依賴衝突排查三大利器

     編輯:VC 教學

背景:DLL Hell 依舊存在

雖然 .NET 組件並行運行緩解了「DLL 地獄」,但大量存量 C++/COM 專案仍面臨:版本衝突、入口點缺失、加載順序錯誤。標準工具(Depends.exe、Process Explorer)功能固定,難以實現自動化日誌、腳本控制、快照對比等高級需求。本文提供三個自製工具源碼,掌握核心技術後可按需擴展。

現有工具回顧

Depends.exe (Dependency Walker)

  • VC++ 附帶,靜態分析 EXE/DLL 導入表,顯示依賴樹。
  • 右鍵菜單可顯示完整路徑。
  • 局限:僅靜態分析,無法檢測 LoadLibrary/GetProcAddress 動態加載、COM 延遲激活的 DLL。

Depends 顯示完整路徑
圖一

Sysinternals ListDlls / Process Explorer

  • 動態掃描進程已加載模塊,顯示基址、路徑、版本。
  • Process Explorer 3.11+ 支持快照對比,高亮新增/釋放對象。
  • 局限:掃描間隔內極短壽命 DLL 可能漏檢;無法直接回答「哪個進程正在使用某 DLL」。

Process Explorer
圖二

自製工具一:DllSpy —— 反向查詢「誰在用這個 DLL」

  • 上窗格:列出系統中所有已加載 DLL(路徑、版本、基址)。
  • 選中 DLL → 下窗格顯示所有使用該 DLL 的進程(PID、進程名、加載基址、靜態/動態加載標記)。

DllSpy 界面
圖三

自製工具二:ProcessSpy —— 正向查詢「這個進程加載了什麼 DLL」

  • 上窗格:所有運行進程。
  • 選中進程 → 下窗格顯示其加載的所有 DLL(基址、優先加載地址、靜態/動態、路徑)。

ProcessSpy 界面
圖四

自製工具三:ProcessXP —— 會話/會話隔離視圖

  • 專為 Windows XP/Server 2003 終端服務設計,列出所有會話及其進程樹。
  • 解決多用戶會話下進程可見性問題。

核心技術點預告

下回將詳細講解:

  1. 如何枚舉系統進程(ToolHelp32、PSAPI、NtQuerySystemInformation)。
  2. 如何獲取進程加載模塊列表(EnumProcessModules、PEB 遍歷)。
  3. 如何實現跨進程模塊關聯統計。

參考資料

  • Win32 API 枚舉窗口與進程
  • VDMDBG 函數在 NT/2000/XP 中的使用
  • 調用 Shell 文件屬性對話框
  • NT 系統中啟動/終止 16 位應用
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved