none
Eigener Stacktrace mit IDebugSymbolGroup2 und GetSymbolName / GetSymbolValueText RRS feed

  • Frage

  • Hi,

    ich baue mir gerade ein eigenes Programm zum Untersuchen von MiniDumps.
    Ich scheitere zur Zeit bei der Anzeige der Argumente der Funktionen in einem Call-Stack.

    Zum Testen verwende ich einen "bekannten" Absturz-Minidump:

    class CMyObject { CString Text; };
    void Compare(CMyObject *pObject1, CMyObject *pObject2)
    {
      pObject1->Text.CompareNoCase(pObject2->Text);
    }

    void Test(COther *pOther1, COther *pOther2)
    {
      Compare(nullptr, nullptr);
    }

    * MiniDump in WinDbg, dort "Call Stack" mit "Source args":

    Compare(class CMyObject * pObject1 = 0x00000000, class CMyObject * pObject2 = 0x00000000)
    Test(class COther * pOther1 = 0x00000000, class COther * pOther2 = 0x00000000)
    Super: ich sehe sofort: Ich arbeite mit Null-Pointern und habe keine Check....

    Selber mache ich:
    * mit IDebugControl4::GetStackTrace den Stack holen
    * IDebugSymbolGroup2 holen
    * zu jedem Frame (mit IDebugSymbols3::SetScope) hole ich mir die DEBUG_SCOPE_GROUP_ARGUMENTS und DEBUG_SCOPE_GROUP_LOCALS
    * zu jedem Symbol hole ich mir mit GetSymbolName, GetSymbolValueText und GetSymbolTypeName die Infos

    Ich bekomme quasi

    mfc100!CString::CompareNoCase+0x15
    char * psz 0x5fc31c14 "--- memory read error at address 0x5fc31c14 ---"

    MyDLL!Compare
    Symbol 1
    Name: pMyObject1
    Value: 0x5fc31c14 class CMyObject *
    Type: class CMyObject *
    Symbol 2
    Name: pMyObject2
    Value: 0x08afcfc0 class CMyObject *
    Type: class CMyObject *


    MyDLL!Test
    Symbol 1
    Name: pOther1
    Value: 0x5fc31c14 class COther *
    Type: class COther *
    Symbol 2
    Name: pOther2
    Value: 0x08afcfc0 class COther *
    Type: class CMyObject *

    GetSymbolName liefert mir also immer den erwarteten Namen, aber mit dem Ergebnis von GetSymbolValueText
    kann ich nichts anfangen. Hier bekomme ich immer den gleichen "Pointer" zusammen mit einem anderen Typnamen.

    Ich würde aber gerne wie in WinDbg sehen, dass ich da auf Nullpointern arbeite...

    Tschüß, Holger.

    Montag, 25. März 2013 13:36

Antworten

Alle Antworten

  • ich nutze jetzt OutputStackTrace mit DEBUG_STACK_SOURCE_LINE und DEBUG_STACK_PARAMETERS
    und interpetiere die Ausgabe.

    Ist zwar etwas komplizierter - aber immerhin funktioniert es...

    Tschüß, Holger.

    Donnerstag, 28. März 2013 14:11
  • Und vermutlich auch viel schneller...


    Jochen Kalmbach (MVP VC++)
    • Als Antwort markiert Holger Gothan Mittwoch, 3. April 2013 10:12
    Donnerstag, 28. März 2013 14:47