2 #define ST_BACKTRACE_H 1
12 nptrs = backtrace(buffer, sz);
13 fprintf(stderr,
"backtrace() returned %d addresses\n", nptrs);
14 backtrace_symbols_fd(buffer, sz, 2);
17 #elif defined(USE_WIN32)
27 unsigned short frames;
31 IMAGEHLP_LINE64 *line;
34 process = GetCurrentProcess();
35 SymInitialize(process, NULL, TRUE);
36 frames = CaptureStackBackTrace(0, sz, stack, NULL);
37 fprintf(stderr,
"backtrace returned %d addresses\n", frames);
38 symbol = (SYMBOL_INFO*)calloc(
sizeof(SYMBOL_INFO) + 1024 *
sizeof(char), 1);
39 symbol->MaxNameLen = 1024;
40 symbol->SizeOfStruct =
sizeof(SYMBOL_INFO);
42 line = (IMAGEHLP_LINE64 *)malloc(
sizeof(IMAGEHLP_LINE64));
43 line->SizeOfStruct =
sizeof(IMAGEHLP_LINE64);
45 for(i = 0; i < frames; i++) {
46 SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol);
50 name =
"<unknown frame>";
52 if (SymGetLineFromAddr64(process, (DWORD64)(stack[i]), &displacement, line)) {
53 fprintf(stderr,
"%d: %s in %s:%d 0x%llx\n", frames - i - 1, name, line->FileName, line->LineNumber, symbol->Address);
55 fprintf(stderr,
"%d: %s 0x%llx\n", frames - i - 1, name, symbol->Address);