ResolvedTrace resolve()

in src/backward.h [3420:3464]


    ResolvedTrace resolve(ResolvedTrace t)
    {
        HANDLE process = GetCurrentProcess();

        char name[256];

        memset(&sym, 0, sizeof sym);
        sym.sym.SizeOfStruct = sizeof(SYMBOL_INFO);
        sym.sym.MaxNameLen = max_sym_len;

        if (!SymFromAddr(process, (ULONG64)t.addr, &displacement, &sym.sym)) {
            // TODO:  error handling everywhere
            LPTSTR lpMsgBuf;
            DWORD dw = GetLastError();

            FormatMessage(
                FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL,
                dw,
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPTSTR)&lpMsgBuf,
                0,
                NULL);

            printf(lpMsgBuf);

            // abort();
        }
        UnDecorateSymbolName(sym.sym.Name, (PSTR)name, 256, UNDNAME_COMPLETE);

        DWORD offset = 0;
        IMAGEHLP_LINE line;
        if (SymGetLineFromAddr(process, (ULONG64)t.addr, &offset, &line)) {
            t.object_filename = line.FileName;
            t.source.filename = line.FileName;
            t.source.line = line.LineNumber;
            t.source.col = offset;
        }

        t.source.function = name;
        t.object_filename = "";
        t.object_function = name;

        return t;
    }