Resolve Managed und Native Stack Trace - Welche API soll verwendet werden?

Dies ist die Fortsetzung meiner vorherigen Frage - Phase 2 sozusagen.

Erste Frage war hier:Fast Capture Stack Trace unter Windows / 64-Bit / Mixed Mode

etzt habe ich eine große Anzahl von Stack-Traces aufgelöst und frage mich, wie die Symbolinformationen von verwalteten Stack-Frames aufgelöst werden solle

Für native C ++ - Seite ist es relativ einfach -

Zunächst legen Sie fest, von welchem Prozess aus Symbole entnommen werden sollen:

HANDLE g_hProcess = GetCurrentProcess();

Wo Sie den Prozess zur Laufzeit mithilfe des folgenden Code-Snipets ersetzen können:

g_hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, g_processId);

b = (g_hProcess != NULL );

if( !b )
    errInfo.AppendFormat(_T("Process id '%08X' is not running anymore."), g_processId );
else
    InitSymbolLoad();

Und initialisiere das Laden des Symbols:

void InitSymbolLoad()
{
    SymInitialize(g_hProcess, NULL, TRUE);
    DWORD dwFlags = SymGetOptions();
    SymSetOptions(SymGetOptions() | SYMOPT_DEFERRED_LOADS | SYMOPT_NO_IMAGE_SEARCH);
}

Und danach natives Symbol auflösen, irgendwie wie folgt:

extern HANDLE g_hProcess;

void StackFrame::Resolve()
{
    struct {
        union
        {
            SYMBOL_INFO symbol;
            char buf[sizeof(SYMBOL_INFO) + 1024];
        }u;
    }ImageSymbol = { 0 };

    HANDLE hProcess = g_hProcess;
    DWORD64 offsetFromSymbol = 0;

    ImageSymbol.u.symbol.SizeOfStruct = sizeof(SYMBOL_INFO);
    ImageSymbol.u.symbol.Name[0] = 0;
    ImageSymbol.u.symbol.MaxNameLen = sizeof(ImageSymbol) - sizeof(SYMBOL_INFO);
    SYMBOL_INFO* pSymInfo = &ImageSymbol.u.symbol;

    // Get file / line of source code.
    IMAGEHLP_LINE64 lineStr = { 0 };
    lineStr.SizeOfStruct = sizeof(IMAGEHLP_LINE64);

    function.clear();


    if( SymGetLineFromAddr64(hProcess, (DWORD64)ip, (DWORD*)&offsetFromSymbol, &lineStr) )
    {
        function = lineStr.FileName;
        function += "(";
        function += std::to_string((_ULonglong) lineStr.LineNumber).c_str();
        function += "): ";
    }

    // Successor of SymGetSymFromAddr64.
    if( SymFromAddr(hProcess, (DWORD64)ip, &offsetFromSymbol, pSymInfo) )
        function += ImageSymbol.u.symbol.Name;

}

Das sieht nach Arbeiten aus.

Aber jetzt werden auch Stack-Frames verwaltet.

Es gibt zwei Schnittstellen, die ich gefunden habe:

IDebugClient / GetNameByOffset

Erwähnt in

http: //www.codeproject.com/Articles/371137/A-Mixed-Mode-Stackwalk-with-the-IDebugClient-Inte (*) (Enthält Beispielcode)http: //blog.steveniemitz.com/building-a-mixed-mode-stack-walker-part-1

Benutzt von

https: //github.com/okigan/CrashInsigh (Code seit 4 Jahren nicht mehr berührt)

Mixed Mode Stackwalk Artikel bietet ein gutes Beispiel.

IXCLRDATAProcess / GetRuntimeNameByAddress

Erwähnt auch in zwei Links oben.

Von Prozess-Hacker verwendet (GPL-Lizenz, C-Stil)

Implementation scheint hier zu liegen:

https: //github.com/dotnet/coreclr/blob/master/src/debug/daccess/daccess.cp (Basierend auf Commits ist dieser Code ziemlich lebendig)

ICorProfiler / ???

Erwähnt am Ende des (*) Artikels.

Ansatz 1 scheint ziemlich altmodisch zu sein, auch in Artikel (*) werden einige Probleme erwähnt.

Approach 3 erfordert wahrscheinlich eine eingehende Analyse der Profiling-APIs. Es gibt auch eine Erwähnung, die ich über diese APIs gefunden habe - hier:

https: //naughter.wordpress.com/2015/05/24/changes-in-windows-10-sdk-compared-to-windows-8-1-part-two

· Cor.h, cordebu, gh / idl, corError.h, corHdr.h, corhlpr.h, corprof.h / idl, corpub.h / idl & corsym.h / idl: Alle diese Header-Dateien wurden entfernt . Sie sind alle die COM-Schnittstelle im einheitlichen Modus für .NET.

iesen Satz verstehe ich nicht ganz. Sind diese Schnittstellen tot oder ersetzt oder was ist mit ihnen passiert?

So ich denke, basierend auf meinem kurzen Analyseansatz 2 ist nur eine gute / lebendige API-Schnittstelle, die es wert ist, verwendet zu werden? Sind Sie auf Probleme gestoßen, die mit diesen APIs zusammenhängen?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage