Skip to content

[meta] Add support for CodeView, the MSVC-compatible debug information format #12655

Description

@timurrrr
Bugzilla Link 12283
Resolution FIXED
Resolved on Jun 15, 2016 19:52
Version trunk
OS Windows NT
Blocks llvm/llvm-bugzilla-archive#13707
CC @amccarth-google,@asl,@majnemer,@echristo,@tritao,@tkremenek,@rnk

Extended Description

$ clang.exe -v
clang version 3.1 (trunk 152788)
Target: i686-pc-win32
Thread model: posix

$ cl /nologo /Zi debug_info.c dbghelp.lib && debug_info.exe
debug_info.c
#​00 main debug_info.c:12
#​01 __tmainCRTStartup f:\dd\vctools\crt_bld\self_x86\crt\src\crt0.c:266
#​02 BaseThreadInitThunk+0x00000012
#​03 RtlInitializeExceptionChain+0x00000063
#​04 RtlInitializeExceptionChain+0x00000036
Done

$ clang.exe -g debug_info.c "C:\Program Files\Microsoft SDKs\Windows\v7.0\Lib\dbghelp.lib" && a.out
#​00
#​01
#​02 BaseThreadInitThunk+0x00000012
#​03 RtlInitializeExceptionChain+0x00000063
#​04 RtlInitializeExceptionChain+0x00000036
Done

$ more debug_info.c
#include <windows.h>

#include <dbghelp.h>
#include <stdio.h>

#pragma comment(lib, "dbghelp.lib")

#define CHECK(x) do { if (!(x)) { printf("%s failed\n", #x); abort(); } } while(0)

int main(void) {
void *stacktrace[16];
size_t n, count = CaptureStackBackTrace(0, 16, stacktrace, NULL);
HANDLE proc = GetCurrentProcess();
CHECK(SymInitialize(proc, NULL, TRUE));

for (n = 0; n < 16 && n < count; ++n) {
// See http://msdn.microsoft.com/en-us/library/ms680578(VS.85).aspx
char buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME * sizeof(CHAR)];
PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer;
IMAGEHLP_LINE64 info;
DWORD64 offset = 0;
DWORD unused;
BOOL got_objname, got_fileline;

DWORD64 addr = (DWORD64)stacktrace[n];

symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
symbol->MaxNameLen = MAX_SYM_NAME;
got_objname = SymFromAddr(proc, addr, &offset, symbol);
info.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
got_fileline = SymGetLineFromAddr64(proc, addr, &unused, &info);
if (got_fileline) {
  printf(" #%02d %s %s:%ld\n", n, symbol->Name, info.FileName, info.LineNumber);
} else if (got_objname) {
  printf(" #%02d %s+0x%p\n", n, symbol->Name, (void*)offset);
} else {
  printf(" #%02d <no info>\n", n);
}

}
printf("Done\n");
return 0;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugzillaIssues migrated from bugzillaclangClang issues not falling into any other category

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions