2017-12-11 27 views
0

私はシンボルファイルにアクセスできる間に、ダンプファイルをデバッグしています。ダンプとシンボルファイルから変数名を取得する方法は?

私はwindbgコマンドを次の結果を組み合わせた、スクリプトを使用しています。(少なくとも、それは私がそれを理解する方法

x /2 *!* // which types are present in the symbol files? 
!heap -h 0 // which memory address ranges are used in the dump? 

だ場合、私が間違っている私を修正することを躊躇しません。 )

this list of Windbg extensionsの下にあるheap_stat.pyと呼ばれるスクリプトの結果は、メモリアドレスのリストの後にそのタイプが続きます。メモリリークがある場合、私はそこから得られる統計を取っています。 (もちろんCStringArrayの特定の場合に)、私が使用CStringArrayオブジェクトのエントリの合計量を見て、そこかどうかを見ることができる前記メモリアドレスのWinDbgのコマンドdt CStringArray m_nSizeを使用して、この上で

、多くのエントリを持つオブジェクトはCStringArrayです。

しかし、このシステムの欠点がある:私はエントリの多くのそのようCStringArrayオブジェクトを検索すると私のアプリケーション内のすべてのCStringArrayのオブジェクトのうち、私はどちら見当がつかないので
は、私はそこにこだわっています私は対処している。

ローカル変数の名前はメモリアドレスのものですが、キャッチがあります:この情報が存在するかどうかわかりませんが、そうであればシンボルファイルで見つけることができます(明らかに)この情報を取得するためにはどのコマンドを実行する必要がありますか(<memory address>が占有するローカル変数名をdt <flag> <memory address>に返すフラグが見つかりませんでした)。

誰も私を助けることができますか?明確化の目的のために

が、これは私のスクリプトの結果が現在のように見える方法です:あなたが見ることができるように、私は私の変数が格納されているメモリアドレスを見ることができます

0x0065a4d0 mfc110u!CStringArray Size:[1] 
0x0065a4e4 mfc110u!CStringArray Size:[0] 
0x0065a4f8 mfc110u!CStringArray Size:[295926] 
0x0065a520 mfc110u!CStringArray Size:[0] 

、私は(種類を見ることができます)シンボルファイルから取得した、と私はdtWindbgコマンドから取得したエントリの量を()見ることができますが、私は次のような出力を持っているしたいと思います:

0x0065a4d0 mfc110u!CStringArray Size:[1]  var1 
0x0065a4e4 mfc110u!CStringArray Size:[0]  var2 
0x0065a4f8 mfc110u!CStringArray Size:[295926] var3 
0x0065a520 mfc110u!CStringArray Size:[0]  var3 

か:

0x0065a4d0 mfc110u!CStringArray Size:[1]  obj1.prop1 
0x0065a4e4 mfc110u!CStringArray Size:[0]  obj2.prop1 
0x0065a4f8 mfc110u!CStringArray Size:[295926] obj1.prop2 
0x0065a520 mfc110u!CStringArray Size:[0]  obj1.prop2 

このような出力は、ソースコード内でvar3またはobj1.prop2に何が起こっているかを確認する必要があることを示しています。

答えて

0

私は、次のMFCアプリケーション(部分ソース)を書いた:

CStringArray stringarray; 
void* anotherarray = new CStringArray(); 

void CLocalVariableNameApp::AnotherMethod(void* a) 
{ 
    CStringArray* temp = static_cast<CStringArray*>(a); 
    temp->Add(L"Something else"); 
} 

CLocalVariableNameApp::CLocalVariableNameApp() 
{ 
    stringarray.Add(L"Something"); 
    AnotherMethod(anotherarray); 
    CStringArray* holycow = static_cast<CStringArray*>(anotherarray); 
    holycow->Add(L"Yet something else"); 
    DebugBreak(); 
} 

あなたが見ることができるように、第二CStringArrayは複数の名前があります:anotherarrayatempholycowを。

観測1:メモリアドレスと変数名に簡単な1:1マッピングはありません。

ローカル変数名は、PDBファイルから入手できます。

0:000> k 
# ChildEBP RetAddr 
00 0022fa40 00fa2a30 KERNELBASE!DebugBreak+0x2 
01 0022fb3c 00f97958 LocalVariableName!CLocalVariableNameApp::CLocalVariableNameApp+0x90 [c:\...\localvariablename.cpp @ 38] 
02 0022fc10 014b628a LocalVariableName!`dynamic initializer for 'theApp''+0x28 [c:\...\localvariablename.cpp @ 43] 
03 0022fc18 014b5e8c LocalVariableName!_initterm+0x1a [f:\...\crt0dat.c @ 955] 
04 0022fc2c 014a9263 LocalVariableName!_cinit+0x6c [f:\...\crt0dat.c @ 308] 
05 0022fc78 014a947d LocalVariableName!__tmainCRTStartup+0xf3 [f:\...\crt0.c @ 237] 
06 0022fc80 7558336a LocalVariableName!wWinMainCRTStartup+0xd [f:\...\crt0.c @ 165] 
07 0022fc8c 771198f2 kernel32!BaseThreadInitThunk+0xe 
08 0022fccc 771198c5 ntdll!__RtlUserThreadStart+0x70 
09 0022fce4 00000000 ntdll!_RtlUserThreadStart+0x1b 
0:000> .frame 1 
01 0022fb3c 00f97958 LocalVariableName!CLocalVariableNameApp::CLocalVariableNameApp+0x90 [c:\...\localvariablename.cpp @ 38] 
0:000> dv 
      this = 0x01637118 
     holycow = 0x00445820 

注名前atempが表示されていないこと。

観測2:変数名はスコープに限定されます。すべての変数名を覚えたい場合は、すべての関数を追跡する必要があります。

上記はデバッグビルドでした。リリースビルドは異なります。

0:000> k 
# ChildEBP RetAddr 
00 005efe04 002a1c18 KERNELBASE!DebugBreak+0x2 
01 005efe20 002a1095 LocalVariableName!CLocalVariableNameApp::CLocalVariableNameApp+0x88 [c:\...\localvariablename.cpp @ 39] 
02 005efe24 003c0289 LocalVariableName!`dynamic initializer for 'theApp''+0x5 [c:\...\localvariablename.cpp @ 43] 
03 005efe38 003c01ea LocalVariableName!_initterm+0x29 [f:\...\crt0dat.c @ 954] 
04 005efe48 003bd280 LocalVariableName!_cinit+0x5a [f:\...\crt0dat.c @ 321] 
05 005efe88 7558336a LocalVariableName!__tmainCRTStartup+0xde [f:\...\crt0.c @ 237] 
06 005efe94 771198f2 kernel32!BaseThreadInitThunk+0xe 
07 005efed4 771198c5 ntdll!__RtlUserThreadStart+0x70 
08 005efeec 00000000 ntdll!_RtlUserThreadStart+0x1b 
0:000> .frame 1 
01 005efe20 002a1095 LocalVariableName!CLocalVariableNameApp::CLocalVariableNameApp+0x88 [c:\...\localvariablename.cpp @ 39] 
0:000> dv 
      this = 0x0043f420 

holycowがありません。

観測3:リリースビルドでは、変数が必要(最適化)されておらず、存在しない可能性があります。

全体的な結論:メモリアドレスを変数名にマップすることはできません。

+0

努力をいただきありがとうございます。私が取り組んでいる製品がリリースビルドとして提供されているように、これは私の質問には答えられないということを意味します。 – Dominique

関連する問題