cómo obtener un seguimiento de la pila del archivo de volcado mediante programación en Windows

StackOverflow https://stackoverflow.com/questions/838947

  •  22-07-2019
  •  | 
  •  

Pregunta

Quiero recuperar el seguimiento de la pila de un archivo de volcado de usuario mediante programación. Hay este volcado de usuario en una ubicación conocida y quiero extraer solo el rastro de la pila y ponerlo en un archivo de texto sin formato. ¿Hay alguna manera de hacerlo?

NOTA: Puedo hacerlo manualmente: abra windbg y escriba " k " comando - pero como mencioné anteriormente, quiero hacer esto mediante programación.

Gracias

¿Fue útil?

Solución

debe verificar la windbg subcarpeta sdk con ejemplos de cómo dbgeng.dll se puede usar mediante programación.
muestra de código:

 PSTR g_DumpFile;
 PSTR g_ImagePath;
 PSTR g_SymbolPath;

 ULONG64 g_TraceFrom[3];

 IDebugClient* g_Client;
 IDebugControl* g_Control;
 IDebugSymbols* g_Symbols;

  void CreateInterfaces(void)
  {
    HRESULT Status;

    // Start things off by getting an initial interface from
    // the engine.  This can be any engine interface but is
    // generally IDebugClient as the client interface is
    // where sessions are started.
    if ((Status = DebugCreate(__uuidof(IDebugClient),
                              (void**)&g_Client)) != S_OK)
    {
        Exit(1, "DebugCreate failed, 0x%X\n", Status);
    }

    // Query for some other interfaces that we'll need.
    if ((Status = g_Client->QueryInterface(__uuidof(IDebugControl),
                                           (void**)&g_Control)) != S_OK ||
        (Status = g_Client->QueryInterface(__uuidof(IDebugSymbols),
                                           (void**)&g_Symbols)) != S_OK)
    {
        Exit(1, "QueryInterface failed, 0x%X\n", Status);
    }
 }

 void
 DumpStack(void)
 {
    HRESULT Status;
    PDEBUG_STACK_FRAME Frames = NULL;
    int Count = 50;

    printf("\nFirst %d frames of the call stack:\n", Count);

    if (g_TraceFrom[0] || g_TraceFrom[1] || g_TraceFrom[2])
    {
        ULONG Filled;

        Frames = new DEBUG_STACK_FRAME[Count];
        if (Frames == NULL)
        {
            Exit(1, "Unable to allocate stack frames\n");
        }

        if ((Status = g_Control->
             GetStackTrace(g_TraceFrom[0], g_TraceFrom[1], g_TraceFrom[2],
                           Frames, Count, &Filled)) != S_OK)
        {
            Exit(1, "GetStackTrace failed, 0x%X\n", Status);
        }

        Count = Filled;
    }

    // Print the call stack.
    if ((Status = g_Control->
         OutputStackTrace(DEBUG_OUTCTL_ALL_CLIENTS, Frames,
                          Count, DEBUG_STACK_SOURCE_LINE |
                          DEBUG_STACK_FRAME_ADDRESSES |
                          DEBUG_STACK_COLUMN_NAMES |
                          DEBUG_STACK_FRAME_NUMBERS)) != S_OK)
    {
        Exit(1, "OutputStackTrace failed, 0x%X\n", Status);
    }

    delete[] Frames;
 }


 void __cdecl main(int Argc, __in_ecount(Argc) char** Argv)
 {
    CreateInterfaces();

    ParseCommandLine(Argc, Argv);

    ApplyCommandLineArguments();

    DumpStack();

    Exit(0, NULL);
 }

Otros consejos

Escribí un artículo sobre el volcado de la pila en C / C ++ con Windows y Unix / Linux en DDJ hace algunos años. No utiliza un cordump, pero escribe cuadros de pila en un archivo de registro, en errores internos o cuando el sistema operativo determina un error de aplicación.

Quizás te ayude:

Ver http://www.ddj.com/architect/185300443

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top