Skip to content

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

Closed
@timurrrr

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions