mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-25 11:10:47 +00:00
Update ebacktrace to avoid crashes and improve the quality of the diagnostic output.
git-svn-id: https://svn.eduke32.com/eduke32@4503 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
a03f9bce40
commit
e647b6a42f
3 changed files with 94 additions and 32 deletions
Binary file not shown.
Binary file not shown.
|
@ -43,6 +43,10 @@
|
||||||
# define PACKAGE_VERSION 1
|
# define PACKAGE_VERSION 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__) || defined(_WIN64)
|
||||||
|
# define EBACKTRACE64
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <bfd.h>
|
#include <bfd.h>
|
||||||
#include <psapi.h>
|
#include <psapi.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -58,6 +62,9 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef MS_VC_EXCEPTION
|
||||||
|
# define MS_VC_EXCEPTION 1080890248
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined __GNUC__ || defined __clang__
|
#if defined __GNUC__ || defined __clang__
|
||||||
# define ATTRIBUTE(attrlist) __attribute__(attrlist)
|
# define ATTRIBUTE(attrlist) __attribute__(attrlist)
|
||||||
|
@ -180,7 +187,8 @@ init_bfd_ctx(struct bfd_ctx *bc, const char * procname, struct output_buffer *ob
|
||||||
|
|
||||||
if (!(r1 && r2 && r3)) {
|
if (!(r1 && r2 && r3)) {
|
||||||
bfd_close(b);
|
bfd_close(b);
|
||||||
output_print(ob,"Failed to init bfd from (%s): %d %d %d\n", procname, r1,r2,r3);
|
if (!(r1 && r2))
|
||||||
|
output_print(ob,"Failed to init bfd from (%s): %d %d %d\n", procname, r1, r2, r3);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -238,16 +246,17 @@ release_set(struct bfd_set *set)
|
||||||
{
|
{
|
||||||
while(set) {
|
while(set) {
|
||||||
struct bfd_set * temp = set->next;
|
struct bfd_set * temp = set->next;
|
||||||
free(set->name);
|
if (set->name)
|
||||||
|
free(set->name);
|
||||||
close_bfd_ctx(set->bc);
|
close_bfd_ctx(set->bc);
|
||||||
free(set);
|
free(set);
|
||||||
set = temp;
|
set = temp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static char procname[MAX_PATH];
|
static char procname[MAX_PATH];
|
||||||
|
|
||||||
#if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__)
|
#ifdef EBACKTRACE64
|
||||||
# define MachineType IMAGE_FILE_MACHINE_AMD64
|
# define MachineType IMAGE_FILE_MACHINE_AMD64
|
||||||
# define MAYBE64(x) x ## 64
|
# define MAYBE64(x) x ## 64
|
||||||
#else
|
#else
|
||||||
|
@ -268,7 +277,7 @@ _backtrace(struct output_buffer *ob, struct bfd_set *set, int depth , LPCONTEXT
|
||||||
|
|
||||||
memset(&frame,0,sizeof(frame));
|
memset(&frame,0,sizeof(frame));
|
||||||
|
|
||||||
#if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__)
|
#ifdef EBACKTRACE64
|
||||||
frame.AddrPC.Offset = context->Rip;
|
frame.AddrPC.Offset = context->Rip;
|
||||||
frame.AddrStack.Offset = context->Rsp;
|
frame.AddrStack.Offset = context->Rsp;
|
||||||
frame.AddrFrame.Offset = context->Rbp;
|
frame.AddrFrame.Offset = context->Rbp;
|
||||||
|
@ -330,23 +339,34 @@ _backtrace(struct output_buffer *ob, struct bfd_set *set, int depth , LPCONTEXT
|
||||||
file = "[unknown file]";
|
file = "[unknown file]";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (func == NULL) {
|
|
||||||
output_print(ob,"0x%x : %s : %s \n",
|
output_print(ob,"0x%p : %s : %s", frame.AddrPC.Offset, module_name, file);
|
||||||
frame.AddrPC.Offset,
|
if (func != NULL)
|
||||||
module_name,
|
output_print(ob, " (%d) : in function (%s)", line, func);
|
||||||
file);
|
output_print(ob, "\n");
|
||||||
}
|
|
||||||
else {
|
|
||||||
output_print(ob,"0x%x : %s : %s (%d) : in function (%s) \n",
|
|
||||||
frame.AddrPC.Offset,
|
|
||||||
module_name,
|
|
||||||
file,
|
|
||||||
line,
|
|
||||||
func);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LPTSTR FormatErrorMessage(DWORD dwMessageId)
|
||||||
|
{
|
||||||
|
LPTSTR lpBuffer = NULL;
|
||||||
|
|
||||||
|
// from http://stackoverflow.com/a/455533
|
||||||
|
FormatMessage(
|
||||||
|
FORMAT_MESSAGE_FROM_SYSTEM
|
||||||
|
|FORMAT_MESSAGE_ALLOCATE_BUFFER
|
||||||
|
|FORMAT_MESSAGE_IGNORE_INSERTS,
|
||||||
|
NULL,
|
||||||
|
dwMessageId,
|
||||||
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)
|
||||||
|
(LPTSTR)&lpBuffer,
|
||||||
|
0,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
return lpBuffer; // must be LocalFree()'d by caller
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static char * g_output = NULL;
|
static char * g_output = NULL;
|
||||||
static PVOID g_prev = NULL;
|
static PVOID g_prev = NULL;
|
||||||
|
|
||||||
|
@ -355,19 +375,61 @@ exception_filter(LPEXCEPTION_POINTERS info)
|
||||||
{
|
{
|
||||||
struct output_buffer ob;
|
struct output_buffer ob;
|
||||||
int logfd, written;
|
int logfd, written;
|
||||||
output_init(&ob, g_output, BUFFER_MAX);
|
PEXCEPTION_RECORD exception;
|
||||||
|
BOOL initialized = FALSE;
|
||||||
|
|
||||||
if (!SymInitialize(GetCurrentProcess(), 0, TRUE)) {
|
for (exception = info->ExceptionRecord; exception != NULL; exception = exception->ExceptionRecord)
|
||||||
output_print(&ob,"Failed to init symbol context\n");
|
{
|
||||||
}
|
#if 0
|
||||||
else {
|
if (exception->ExceptionFlags & EXCEPTION_NONCONTINUABLE)
|
||||||
struct bfd_set *set = calloc(1,sizeof(*set));
|
continuable = FALSE;
|
||||||
bfd_init();
|
#endif
|
||||||
_backtrace(&ob , set , 128 , info->ContextRecord);
|
|
||||||
release_set(set);
|
|
||||||
|
|
||||||
SymCleanup(GetCurrentProcess());
|
switch (exception->ExceptionCode)
|
||||||
}
|
{
|
||||||
|
case EXCEPTION_BREAKPOINT:
|
||||||
|
case EXCEPTION_SINGLE_STEP:
|
||||||
|
case DBG_CONTROL_C:
|
||||||
|
case MS_VC_EXCEPTION:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!initialized)
|
||||||
|
{
|
||||||
|
output_init(&ob, g_output, BUFFER_MAX);
|
||||||
|
initialized = TRUE;
|
||||||
|
}
|
||||||
|
output_print(&ob, "Caught exception 0x%08X at 0x%p\n", exception->ExceptionCode, exception->ExceptionAddress);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!initialized)
|
||||||
|
return EXCEPTION_CONTINUE_SEARCH; // EXCEPTION_CONTINUE_EXECUTION
|
||||||
|
|
||||||
|
{
|
||||||
|
DWORD error = 0;
|
||||||
|
BOOL SymInitialized = SymInitialize(GetCurrentProcess(), NULL, TRUE);
|
||||||
|
|
||||||
|
if (!SymInitialized)
|
||||||
|
{
|
||||||
|
LPTSTR errorText;
|
||||||
|
|
||||||
|
error = GetLastError();
|
||||||
|
errorText = FormatErrorMessage(error);
|
||||||
|
output_print(&ob, "SymInitialize() failed with error %d: %s\n", error, errorText);
|
||||||
|
LocalFree(errorText);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SymInitialized || error == 87)
|
||||||
|
{
|
||||||
|
struct bfd_set *set = calloc(1,sizeof(*set));
|
||||||
|
bfd_init();
|
||||||
|
_backtrace(&ob , set , 128 , info->ContextRecord);
|
||||||
|
release_set(set);
|
||||||
|
|
||||||
|
SymCleanup(GetCurrentProcess());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
logfd = open(CRASH_LOG_FILE, O_APPEND | O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
|
logfd = open(CRASH_LOG_FILE, O_APPEND | O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
|
||||||
|
|
||||||
|
@ -393,9 +455,9 @@ exception_filter(LPEXCEPTION_POINTERS info)
|
||||||
|
|
||||||
//fputs(g_output, stderr);
|
//fputs(g_output, stderr);
|
||||||
|
|
||||||
exit(1);
|
exit(0xBAC);
|
||||||
|
|
||||||
return 0;
|
return EXCEPTION_CONTINUE_SEARCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in a new issue