//=====================================================================================
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
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.
問題背景:
再現環境: 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