1. 程式人生 > >Windbg常用命令總結

Windbg常用命令總結

  1. 檢視執行緒中的堆疊資訊
    a. ~打印出所有的執行緒資訊
    b. !teb命令檢視執行緒控制塊中的資訊,如StatckBase: 01820000
    c. dps 01820000則可以看到執行緒執行的StackTrace
    或者使用如下命令:
    dds 0096a000 00970000 ; stackbase:0096a000 stacklimit:00970000
    同樣可以檢視執行緒當前的執行堆疊
    d. 在其中出現符號呼叫的地址,如0184eef0。在該位置展開堆疊可採用如下命令:k =0184eef0。就能夠還原該部分堆疊,檢視其對應的棧針資訊。
    注:檢視指定記憶體位置的堆疊資訊可以通過“=[address]”來指定。

  2. 檢視module的描述資訊


    a. lmv m driver可以檢視module載入後的開始和結束位置,若開始位置為:f5022000。Windbg還提供了其他檢視模組載入狀態的命令,如lmD vm Watchdog;lmv a [address]只顯示包含指定地址的模組。
    b. !dh f5022000 -f可檢視該module的頭資訊,其中會記錄module各欄位的起止地址;
    c. db f5022000+”偏移量” 可打出記憶體中的字元資訊,獲得module的資訊;
    注:Windbg中的module 名稱通是不帶字尾名的,如mscrt.dll庫對應模組名為是mscrt。

  3. 載入指定模組的符號檔案
    Windbg對於符號檔案的載入策略為延遲載入,也就是知道符號使用時才將符號載入到偵錯程式,並進行解析。ld命令可打破延遲載入模式,立即將對應模組的符號載入到記憶體,命令格式:
    ld 模組名稱 [/f 符號名稱]

  4. Windbg載入的符號狀態
    偵錯程式載入符號後,通過 lm命令能夠看到載入的符號資訊及符號載入的狀態:
    deffered–模組已經載入,符號尚未載入,將在需要時載入;
    #–符號檔案與可執行檔案的時間戳和校驗和資訊均不匹配;
    T–符號檔案的時間戳資訊丟失,值為0或未獲取到;
    C–符號檔案的校驗和資訊對視,不可訪問或值為0;
    Export–未找到準確的符號檔案,所以符號資訊是從二進位制可執行檔案的到處表中提取出來的;
    M–符號檔案與可執行檔案不匹配,時間戳或校驗和。然而,由於符號配置等原因,符號檔案已載入。

  5. DML開關
    DML–偵錯程式標記語言,可以展現像html一樣的連結,引導使用者在點選連結時從一處跳轉到另一處。通過如下命令可控制DML的開關狀態:
    .prefer_dml 1 // 開啟DML
    .prefer_dml 0 // 關閉DML.

  6. 符號驗證技巧
    如果對於已載入符號的準確性存在疑慮,可以通過一下步驟做驗證:
    1) !sym noisy 開啟符號載入過程列印;
    2) .reload /i ModuleName可以看到符號載入的完整過程,在符號載入完成後,如果有WARNING或ERROR的提示資訊,意味著符號載入過程中出現了錯誤或者異常。
    同時也可以藉助彙編對已載入的符號做基本的校驗:
    u videoprt!videoportfindadapter2檢視該函式符號對應的彙編指令,通常在函式起始位置的指令為:push ebp; mov ebp,esp;

    One other useful technique for verifying symbols is unassembling code. Most functions begin with an add, sub, or push operation using either the base pointer (ebp) or the stack pointer (esp or sp). Try unassembling (U Function) some of the functions on the stack (from offset zero) to verify the symbols.

  7. 符號查詢
    通過x命令查詢包含指定關鍵字的模組,參考:
    1)x *main 2)模組內查詢:x server!m*模組內查詢m開頭的符號

  8. 執行緒切換命令
    ~. 當前執行緒
    ~#切換到出現異常的執行緒
    ~*程序中的所有執行緒
    ~Number 切換到16進位制編號的執行緒。通常執行緒編號的格式為[process_number].[thread_number]
    ~~[TID] 切換到指定執行緒編號的執行緒