mirror of
https://github.com/Kbz-8/Pulse.git
synced 2026-01-11 07:23:35 +00:00
yes
This commit is contained in:
31
Tests/main.c
31
Tests/main.c
@@ -44,17 +44,17 @@
|
|||||||
LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo)
|
LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Exception occurred!\n");
|
fprintf(stderr, "Exception occurred!\n");
|
||||||
PrintStackTrace();
|
FollowStackTrace();
|
||||||
return EXCEPTION_EXECUTE_HANDLER;
|
return EXCEPTION_EXECUTE_HANDLER;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintStackTrace()
|
void FollowStackTrace()
|
||||||
{
|
{
|
||||||
// Initialize symbols
|
|
||||||
HANDLE process = GetCurrentProcess();
|
HANDLE process = GetCurrentProcess();
|
||||||
SymInitialize(process, NULL, TRUE);
|
SymInitialize(process, NULL, TRUE);
|
||||||
|
|
||||||
// Capture stack backtrace
|
SymSetOptions(SYMOPT_LOAD_LINES | SYMOPT_UNDNAME);
|
||||||
|
|
||||||
void* stack[62];
|
void* stack[62];
|
||||||
USHORT frames = CaptureStackBackTrace(0, 62, stack, NULL);
|
USHORT frames = CaptureStackBackTrace(0, 62, stack, NULL);
|
||||||
|
|
||||||
@@ -62,12 +62,25 @@
|
|||||||
symbol->MaxNameLen = 255;
|
symbol->MaxNameLen = 255;
|
||||||
symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
|
symbol->SizeOfStruct = sizeof(SYMBOL_INFO);
|
||||||
|
|
||||||
for(USHORT i = 0; i < frames; i++)
|
IMAGEHLP_LINE64 line;
|
||||||
{
|
DWORD displacement;
|
||||||
SymFromAddr(process, (DWORD64)(stack[i]), 0, symbol);
|
ZeroMemory(&line, sizeof(IMAGEHLP_LINE64));
|
||||||
fprintf(stderr, "[%d] %s - 0x%0llX\n", i, symbol->Name, symbol->Address);
|
line.SizeOfStruct = sizeof(IMAGEHLP_LINE64);
|
||||||
}
|
|
||||||
|
|
||||||
|
for (USHORT i = 0; i < frames; i++)
|
||||||
|
{
|
||||||
|
DWORD64 address = (DWORD64)(stack[i]);
|
||||||
|
if(SymFromAddr(process, address, 0, symbol))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "[%d] %s - 0x%0llX", i, symbol->Name, symbol->Address);
|
||||||
|
if(SymGetLineFromAddr64(process, address, &displacement, &line))
|
||||||
|
fprintf(stderr, " (%s:%lu)\n", line.FileName, line.LineNumber);
|
||||||
|
else
|
||||||
|
fprintf(stderr, " (no file info)\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fprintf(stderr, "[%d] (unable to resolve symbol)\n", i);
|
||||||
|
}
|
||||||
free(symbol);
|
free(symbol);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -206,6 +206,9 @@ for name, module in pairs(tests) do
|
|||||||
add_defines("BACKTRACE")
|
add_defines("BACKTRACE")
|
||||||
elseif is_plat("windows") then
|
elseif is_plat("windows") then
|
||||||
add_defines("WINTRACE")
|
add_defines("WINTRACE")
|
||||||
|
add_cflags("/Zi")
|
||||||
|
add_ldflags("/DEBUG")
|
||||||
|
add_links("dbghelp")
|
||||||
end
|
end
|
||||||
target_end()
|
target_end()
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user