Visual Basic 6.0 のシンボルファイル
シンボルファイルの生成方法
Visual Basic 6.0実行可能ファイル(*.exe,*.dll,*.ocx)をデバッグする際に必要なシンボルファイル(*.pdb)は以下の手順で生成することが可能です。
- Visual Basic 6.0でプロジェクトを開きます。
- プロジェクトのプロパティを開きます。
- [コンパイル]タブを選択します。
- [シンボリックデバッグ情報を生成]にチェックを入れて[OK]ボタンをクリックします。
- プロジェクトをビルドします。
プロジェクトファイル(*.vbp)から確認する場合は、CodeViewDebugInfoプロパティを-1に設定します。(0を設定すると無効になります。)
Type=Exe
Form=Form1.frm
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\Windows\SysWOW64\stdole2.tlb#OLE Automation
Startup="Form1"
HelpFile=""
ExeName32="Project1.exe"
Command32=""
Name="Project1"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=-1
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1
DebugStartupOption=0
Visual Basic 6.0のシンボル ファイルの注意点
Visual Basic 6.0が生成するシンボルファイルはVisual Studio 2012以降のバージョンやWindows Performance Analyzerなど一部の製品やバージョンでは利用することができないようです。シンボルファイルが利用できない場合、実行可能ファイルがシンボルファイルとともにビルドされていなかった場合と同様の扱いとなります。WinDbgは現時点ではVisual Basic 6.0が生成するシンボルファイルを利用することが可能です。以下はWinDbgでVisual basic 6.0アプリケーションのコールスタックを出力した際の例となります。
0:000> k
# ChildEBP RetAddr
00 0019ed58 75cc4f63 win32u!NtUserWaitMessage+0xc
01 0019ed98 75cc4e54 USER32!DialogBox2+0x102
02 0019edc8 75d216eb USER32!InternalDialogBox+0xd9
03 0019ee94 75d20481 USER32!SoftModalMessageBox+0x72b
04 0019eff0 75d20beb USER32!MessageBoxWorker+0x314
05 0019f080 71cc7da4 USER32!MessageBoxIndirectA+0xeb
06 0019f0c0 71cc7c20 MSVBVM60!BASIC_DISPINTERFACE_GetTICount+0x4dc3
07 0019f0e8 71cc7f1b MSVBVM60!BASIC_DISPINTERFACE_GetTICount+0x4c3f
08 0019f118 71cc2b23 MSVBVM60!BASIC_DISPINTERFACE_GetTICount+0x4f3a
09 0019f17c 71cfe366 MSVBVM60!IID_IVbaHost+0x18d93
0a 0019f1f4 00401a90 MSVBVM60!rtcMsgBox+0xfc
0b 0019f2b8 74877bba Project1!Form1::Command1_Click+0xa0 [C:\work\Project1\Form1.frm @ 27]
0c 0019f2d4 71c47b97 MSVBVM60!Zombie_QueryInterface+0x7e3
0d 0019f2ec 71c266cb MSVBVM60!Zombie_QueryInterface+0x7c0
0e 0019f3f4 71c165be MSVBVM60!_vbaRedimPreserve+0x176b
0f 0019f418 71c60da3 MSVBVM60!_vbaVarCat+0x105e
10 0019f448 71c18253 MSVBVM60!GetMem2+0x1132
11 0019f470 71c16d8a MSVBVM60!_vbaVarCat+0x2cf3
12 0019f4cc 71c4a212 MSVBVM60!_vbaVarCat+0x182a
13 0019f4f0 71c14a69 MSVBVM60!rtcLeftVar+0x1957
14 0019f55c 71c175db MSVBVM60!_vbaInStr+0x1152
15 0019f6dc 71c18253 MSVBVM60!_vbaVarCat+0x207b
16 0019f704 71c16d8a MSVBVM60!_vbaVarCat+0x2cf3
17 0019f760 75ce164b MSVBVM60!_vbaVarCat+0x182a
18 0019f78c 75cd7dba USER32!_InternalCallWinProc+0x2b
19 0019f874 75cd8cd9 USER32!UserCallWinProcCheckWow+0x33a
1a 0019f8d8 75cd60bd USER32!SendMessageWorker+0x829
1b 0019f8fc 75cfafdb USER32!SendMessageW+0x4d
1c 0019f920 75cface0 USER32!xxxButtonNotifyParent+0x54
1d 0019f948 75cfa1e8 USER32!xxxBNReleaseCapture+0x141
1e 0019f9e8 75cf9682 USER32!ButtonWndProcWorker+0xad8
1f 0019fa14 75ce164b USER32!ButtonWndProcA+0x52
20 0019fa40 75cd7dba USER32!_InternalCallWinProc+0x2b
21 0019fb28 75cd7576 USER32!UserCallWinProcCheckWow+0x33a
22 0019fb60 75cc475b USER32!CallWindowProcAorW+0x7f
23 0019fb78 71c142d3 USER32!CallWindowProcA+0x1b
24 0019fbe4 71c60896 MSVBVM60!_vbaInStr+0x9bc
25 0019fc0c 71c18253 MSVBVM60!GetMem2+0xc25
26 0019fc34 71c16d8a MSVBVM60!_vbaVarCat+0x2cf3
27 0019fc90 75ce164b MSVBVM60!_vbaVarCat+0x182a
28 0019fcbc 75cd7dba USER32!_InternalCallWinProc+0x2b
29 0019fda4 75cd66f1 USER32!UserCallWinProcCheckWow+0x33a
2a 0019fe20 75cc8480 USER32!DispatchMessageWorker+0x4d1
2b 0019fe28 71c13e6b USER32!DispatchMessageA+0x10
2c 0019fe68 71c13dd1 MSVBVM60!_vbaInStr+0x554
2d 0019feac 71c13caf MSVBVM60!_vbaInStr+0x4ba
2e 0019fec8 71c13b43 MSVBVM60!_vbaInStr+0x398
2f 0019feec 71c3ad43 MSVBVM60!_vbaInStr+0x22c
30 0019ff68 00401176 MSVBVM60!ThunRTMain+0xb2
31 0019ff80 7796809e Project1!__vbaS+0xa
32 0019ffdc 7796806e ntdll!__RtlUserThreadStart+0x2f
33 0019ffec 00000000 ntdll!_RtlUserThreadStart+0x1b