WinDbg基础资料(日本語)

来源:     2015-07-09 11:22:00    人气:     我有话说( 0 人参与)

清泛网(www.tsingfun.com):WinDbg基础资料(日本語)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Section 1: How to Make PDB for DocuWorks Project at Release Build

C++の場合

 Project Properties

 ① C/C++ --> General-->Debug Information Format :       Program Database (/Zi)

         ※--> Optimization --> Optimization :           Disabled (/Od)

   

 ② Linker --> Debugging -->Generate Debug Info :        Yes (/DEBUG)

                 ※-->Grenerate Program Database File: $(TargetDir)$(TargetName).pdb

 

 ③ Build Events --> Post-Build Event --> Command Line: copy "$(OutDir)\$(TargetName).dll" "..\bin\."

                                                        copy "$(OutDir)\$(TargetName).pdb" "..\pdb\."

          ※Make sure you have create the pdb folder

 

.NETの場合

  Project Properties

 ①Build --> Configuration :Release

             General  --> Define DEBUG Constant : ON

             OutPut -->  Output path : bin\Release\

                         Advanced... Button Click --> Debug Info: pdb-only

 

 ② Build Events --> Post-build event command line: copy "$(TargetName).exe" "C:\Program Files\○○Soft\○○Desk\bin\."

                                                    copy "$(TargetName).pdb" "D:\○○SoftSymbls\pdb\."

 

 

//=====================================================================================

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Section 2: Basic Windbg Commands

 

参考資料:

http://www.windbg.info/download/doc/pdf/WinDbg_A_to_Z_color_JP.pdf

 

①PDB設定

.sympath

.sympath SRV*c:\symbols*http://msdl.microsoft.com/download/symbols;c:\Symbols\mydll

 

環境変数:

_NT_SYMBOL_PATH

SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols;c:\Symbols\mydll

 

②Reload

.reload

 

③ Get Call Stack

(Signal Thread)

k

kv

kd

 

(Multi Thread)

~* k

~0s  Set Current Thread,0はThread No.である、変数

 

④引き続き実行

(Signal Thread)

g

 

(Multi Thread)

~* g

 

 

⑤Get .Net Call Stack

.load C:\Windows\Microsoft.NET\Framework\v2.0.50727\SOS.dll

.loadby sos mscorwks

!reload

 

!threads

!clrstack

!clrstack -a

 

 

⑥Crash分析

!analyze -v

 

⑦dumpファイル作成

.dump /mfh  C:\dump\test.dmp

 

 

※⑧Memory Leak

Heap分析、まだ使ってない

!htrace -enable

g

!htrace -diff

 

 

//=============================================================================================================================

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Section 3: Windbg Tips

 

----------------------------------------------------------------------------------------------------------------

Tip01:非Crash問題のソース定位

デバッグ対象にAttachし、定位したい画面を開いて、「Ctrl+Pause/Break」キーを押す。

 

----------------------------------------------------------------------------------------------------------------

Tip02:WinXP Dump生成の方法

http://www.glamenv-septzen.net/view/918

 C:\kktools\userdump8.1\x86>userdump -p

userdump 1268

 

----------------------------------------------------------------------------------------------------------------

Tip03: Create SymbolStore

 

1.環境変数:

pathの中、windbgのインストールパスを追加する

C:\Program Files\Debugging Tools for Windows (x86)

 

2._NT_SYMBOL_PATHを新規定義する

SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols;C:\Symbols;C:\Symbols\DocuWorks

 

3.cmdツール起動して、下記のコマンドを実行する

symstore add /r /f E:\○○SoftSymbls\pdb\*.* /s C:\Symbols\○○Soft /t "○○Desk" /v "8.0.1"

 

※該当コマンドの役割は、pdbファイルをSymbolStoreサーバの形式として登録する、

Windbgで「.sympath」(PDB設定)のコマンド実行不要、直接解析できる。

 

※VS開発環境のDebuging\Symbolsの「Symbol file(.pdb) locations:」の中、

下記のパスを登録して置けば、Windbgで登録されたPDBファイルの参照ができる

C:\Symbols\○○Soft

C:\Symbols

http://msdl.microsoft.com/download/symbols

「シンボルサーバーからシンボルをキャッシュするディレクトリ(C):」の場所に「C:\Symbols」を登録する必要。

 

※HTTP PDB Server構築の資料

http://msdn.microsoft.com/ja-jp/library/ff549781(v=vs.85).aspx

 

----------------------------------------------------------------------------------------------------------------

Tip04: WinDbg Auto Start

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]

"Debugger"="\"C:\\windbg\\windbg.exe\" -p %ld -e %ld -g"

"Auto"="1"

"DebuggerOld"="\"C:\\Windows\\system32\\vsjitdebugger.exe\" -p %ld -e %ld"

 

----------------------------------------------------------------------------------------------------------------

Tip05: メモリ中の文字情報を表示する

0:000> ~44s

 

0:044> !teb

TEB at 7ff7f000

    ExceptionList:        09e5eeb4

    StackBase:            09e60000

    StackLimit:           09e50000

...

 

0:044> dpu 09e50000 09e60000

 

----------------------------------------------------------------------------------------------------------------

Tip06: 64bitOSで32bitのProcessのMemry Dumpを取得する方法

 

You can however use the 32-bit task manager, located in C:\Windows\SysWOW64\taskmgr.exe to get 32-bit dumps.

 

問題背景:

    スキャナ指定ダイアログ遷移時にDeskがクラッシュする

    再現環境: XenApp6.5(Server2008R2)

          ClientPC: Windows7 Professional SP1 x86

          Citrix Online Plug-in 12.3.0.8

          DW8.0.0  

 

調査難点:

  1.XenApp6.5(Server2008R2)環境は64bitで、Desk.exeは32bit、task managerで取得したCrash Dumpは64bit.

    2.上記の環境で、64bit版のWinDbgはインストールできない(出来るとしても、手続きが必要?)

  3.取得したCrash Dumpは、32bitの開発機で分析できない。64bitのマシンを用意する必要がある。

  

  4.取得したCrash Dumpは使い物にならない?

    Win8_64bitの環境(64bitのWinDbgがインストールされた)で、別のCrash ARが調査した。

    Dumpファイルで分析できなかった、但し、WinDbgからAttachする場合は分析可能。

    ※この区別は、今後再確認要

 

解決策:

  64bitOSで32bit版task managerを使えば、32bit版Process(DwDesk.exe)の32bitのMemory Dumpが取得できる。

  32bit版task managerのパス:C:\Windows\SysWOW64\taskmgr.exe

 

参考資料:

http://blogs.msdn.com/b/tess/archive/2010/09/29/capturing-memory-dumps-for-32-bit-processes-on-an-x64-machine.aspx

 

----------------------------------------------------------------------------------------------------------------

Tip07:Crash Dump 自動取得の方法

前提:

お客様環境で、「C」ドライブの直下で「CrashDumps」を作成して置いてください。

 

下記のテキストを「auto_dump_install.reg」として保存して、管理者権限のユーザで実行すれば、Crash Dump 自動取得できる

------------------------------------

Windows Registry Editor Version 5.00

 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]

"DumpCount"=dword:0000000a

"DumpType"=dword:00000002

"CustomDumpFlags"=dword:00000000

"DumpFolder"=hex(2):25,00,55,00,53,00,45,00,52,00,50,00,52,00,4f,00,46,00,49,\

  00,4c,00,45,00,25,00,5c,00,41,00,70,00,70,00,44,00,61,00,74,00,61,00,5c,00,\

  4c,00,6f,00,63,00,61,00,6c,00,5c,00,54,00,65,00,6d,00,70,00,00,00

--------------------------------------

※上記"DumpFolder"の種類はREG_EXPAND_SZ、データは、%USERPROFILE%\AppData\Local\Temp

 

 

下記のテキストを「auto_dump_uninstall.reg」として保存して、管理者権限のユーザで実行すれば、Crash Dump 自動取得の設定を取り消す

-------------------------------------

Windows Registry Editor Version 5.00

 

[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps]

 

参考資料根拠:

http://msdn.microsoft.com/en-us/library/bb787181.aspx

 

http://www.northwind.mydns.jp/samples/blog/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%82%AF%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E6%99%82%E3%81%AE%E3%83%80%E3%83%B3%E3%83%97%E8%87%AA%E5%8B%95%E5%8F%96%E5%BE%97/

 

----------------------------------------------------------------------------------------------------------------

Tip8:お客様環境へ展開する前、調査モジュール有効性確認

背景:下記のモジュールと対応するPDB提供、デバッグ情報取得できるかどうかの確認

    -AAA.exe

    -BBB.dll

    -CCC.dll

    -DDD.dll

 

手順:

WinDbgの「Open Executable」メニューからdwtbt.exeを起動する、

dwtbt.exeの入口で、自動Breakが発生する(Break instruction exception - code 80000003 (first chance)のメッセージがある)

特定の関数にBreakポイントを設置する(bp bbb!CBBBApp::GetIconImageToInit)

※目標モジュールはまだLoadされてない為、Bp expression 'bbb!BBBApp::GetIconImageToInit' could not be resolved, adding deferred bpのエラーは無視

「~* g」のコマンドで引き続き実行させると、「Breakpoint 0 hit」のメッセージが表示される

「~* k」のコマンドでCall Stack取得

 

----------------------------------------------------------------------------------------------------------------

Tip09:.NETのConsole exeとC++のAPI dll混在のデバッグ方法

 

問題背景:

.NETのConsole exeからC++のAPI dll中の関数を呼ばれる一連の流れをデバッグする要望がある。

 

 モジュール呼び出し順序(dllレベル):

        サンプルプログラム(.NETのConsole exe)

        ↓

        xxxapiwn.dll    (.NET版のAPI封装dll)

        ↓

        xxxapi.dll      (C++の公開API dll)

        ↓

        xxxapia.dll     (C++の非公開API dll)

        ?

        ?

        ?

 

.NETのConsole exeを「Start up project」に設定して、デバッグモード起動すると、

.NETのコードはデバッグできるが、C++のコードは入れない問題がある

 

 .NET中でのコード:

   result = XxxapiInternal.XXX_ProtectDocumentW(inputPath, outputPath, protectType, ref pModuleOpt, ref pProtectOpt);

 

 .NET中C++のAPI封装: 

        [DllImport("xxxapi.dll", CharSet = CharSet.Unicode)]

        public static extern int XXX_ProtectDocumentW(string lpszInputPath, string lpszOutputPath, int nProtectType,

     ref XXX_SECURITY_OPTION_PSWD pModuleOption, ref XXX_PROTECT_OPTION pProtectOption);

 

 

解決手順:

1. 各モジュールのPDB付きのRelease版でビルドする

 具体な設定方法は、「Section 1: How to Make PDB for DocuWorks Project at Release Build」へ参照

 

2. .NETのConsole exeのMain関数の中、デバッグ開始したい場所で、MessageBox表示するコードを入れてビルドする。

 例:

   MessageBox.Show("test", "test",MessageBoxButtons.OKCancel,MessageBoxIcon.Information,

       MessageBoxDefaultButton.Button1,MessageBoxOptions.DefaultDesktopOnly);

  ※MessageBox表示できる為、プロジェクトの参照設定の中に、「System.Drawing」と「System.Windows.Forms」を追加する必要、

   また、Program.csの中、「using System.Windows.Forms;」を追加する必要。

 

3.C++のxxxapi.dllのプロジェクトを「Start up project」に設定して、.NETとC++のコードに必要なBreak Pointを作成して置く。

 

4..NETのConsole exe起動させる為のBatファイルを作成する

  例:

   ファイル名:       startXXXNET_ProtectDocument.exe.bat

   中身:          XXXNET_ProtectDocument.exe "C:\temp\testin.xxx" "C:\temp\testout.xxx"

  ※VSのProject Properties --> Debug --> Command line と Argmentsを設定してもデバッグはできるが、

   一旦変更すると、Projectファイルが変更された、またRebuidする必要がある、かなり不便。

   

5.手順4のBatファイルをダブルクリックして、.NETのConsole exeを起動させる

 

6.手順2で入れたメッセージが表示しているうちに、VSの「Debug」メニューから「Atach to Process」をクリックする、

  「Atach to Process」画面の「Atach to」の「Select..」ボタンをクリックする。

    「Select Code Type」画面で、「Debug these code type:」のRadio BoxをCheck ONにして、

   「Managed」と「Native」をCheck ONにして、OKボタンで画面を閉じる。

  「Atach to Process」画面にTargetの.NETのConsole exeを選択して、「Atach」ボタンをクリックすると

    普段のように.NETとC++混在のコードをデバッグできる

 

 

----------------------------------------------------------------------------------------------------------------

Tip10:.デバッガを自動的に起動する

 

背景:

  DW本体あらのある操作を実行する時、

  該当操作のコードの中に、Theadを起動して、Theadから更にAPI関数CreateProcess()を使って何かのexeを起動するケースはよくある。

  目的は該当exeの中身をデバッグする、

 但し、該当exeの起動CmdLineパラメータを取得するまでの調査時間がかかる、効率はあまりよくない。

 

例:

 1.XXDeskの中、1つのXDWファイルを選択して、「○○バー」にある「PDFに変換(○○ PDF Creator)」プラグインボタンをクリックすると、

   bgprinter.h中のCDWBGPrinter::DoBackPrint()関数で、API関数CreateProcess()を使ってxxbgprnt.exeを起動する

 

  2.xxto.exeからまずTheadを起動して、Theadから更にAPI関数CreateProcess()を使ってxxtopbox.exeとxxtoconv.exeを起動する

 

 

下記のテキストを「auto_debug_install.reg」として保存して、管理者権限のユーザで実行すれば、Crash Dump 自動取得できる

------------------------------------

Windows Registry Editor Version 5.00

 

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\xxbgprnt.exe]

"debugger"="vsjitdebugger.exe"

--------------------------------------

 

下記のテキストを「auto_debug_uninstall.reg」として保存して、管理者権限のユーザで実行すれば、Crash Dump 自動取得の設定を取り消す

-------------------------------------

Windows Registry Editor Version 5.00

 

[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\xxbgprnt.exe]

--------------------------------------

※上記"xxbgprnt.exe"は実際にデバッグしたいexeに変更する必要

※メリット、Tip09のMessageBox表示するコード追加は不要になった

 

★vsjitdebugger.exe起動失敗のエラーが発生する場合、

 Visual Studio 2005 コマンド プロンプトの中に「vsjitdebugger.exe /regserver」と言うコマンドを実行する必要。

 

参考資料根拠:

http://msdn.microsoft.com/ja-jp/library/a329t4ed(v=vs.80).aspx


WinDbg

本文源自互联网,采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可,
版权归原作者,如有问题请联系service@tsingfun.com (编辑:admin)