ebacktrace1 updates:

- Updated to use StackWalk64 function call, requiring some addition of headers from MinGW-w64 to compile with MinGW.
- Code added to support 64-bit executables: functionality added and one warning fixed.
- New DLL binaries compiled using i686-MinGW-w64 and x86_64-MinGW-w64. (Oddly, the DLL built with MinGW is 5 MB while MinGW-w64's is 1 MB.)

git-svn-id: https://svn.eduke32.com/eduke32@3299 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
hendricks266 2012-12-16 05:45:29 +00:00
parent 7c94ee6874
commit 0f690797f5
7 changed files with 2175 additions and 37 deletions

View file

@ -68,7 +68,12 @@ ifneq ($(PLATFORM),WII)
MAPSTER32_TARGET:=$(MAPSTER32) MAPSTER32_TARGET:=$(MAPSTER32)
endif endif
EBACKTRACEDLL ?= ebacktrace1.dll ifndef EBACKTRACEDLL
EBACKTRACEDLL = ebacktrace1.dll
ifeq ($(findstring x86_64,$(COMPILERTARGET)),x86_64)
EBACKTRACEDLL = ebacktrace1-64.dll
endif
endif
EBACKTRACEDLL_TARGET:=$(EBACKTRACEDLL) EBACKTRACEDLL_TARGET:=$(EBACKTRACEDLL)
ifeq ($(PLATFORM),WINDOWS) ifeq ($(PLATFORM),WINDOWS)

View file

@ -0,0 +1,55 @@
/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the w64 mingw-runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
#ifndef _dbg_LOAD_IMAGE_h
#define _dbg_LOAD_IMAGE_h
#ifndef WINAPI
#define WINAPI __stdcall
#endif
#define IMAGEAPI DECLSPEC_IMPORT WINAPI
#define DBHLP_DEPRECIATED __declspec(deprecated)
#define DBHLPAPI IMAGEAPI
#ifndef EBACKTRACE_MINGW32
#define IMAGE_SEPARATION (64*1024)
typedef struct _LOADED_IMAGE {
PSTR ModuleName;
HANDLE hFile;
PUCHAR MappedAddress;
#ifdef _IMAGEHLP64
PIMAGE_NT_HEADERS64 FileHeader;
#else
PIMAGE_NT_HEADERS32 FileHeader;
#endif
PIMAGE_SECTION_HEADER LastRvaSection;
ULONG NumberOfSections;
PIMAGE_SECTION_HEADER Sections;
ULONG Characteristics;
BOOLEAN fSystemImage;
BOOLEAN fDOSImage;
BOOLEAN fReadOnly;
UCHAR Version;
LIST_ENTRY Links;
ULONG SizeOfImage;
} LOADED_IMAGE,*PLOADED_IMAGE;
#endif
#define MAX_SYM_NAME 2000
typedef struct _MODLOAD_DATA {
DWORD ssize;
DWORD ssig;
PVOID data;
DWORD size;
DWORD flags;
} MODLOAD_DATA,*PMODLOAD_DATA;
#endif

File diff suppressed because it is too large Load diff

View file

@ -1,17 +1,15 @@
/* /*
Copyright (c) 2010 , Copyright (c) 2010 ,
Cloud Wu . All rights reserved. Cloud Wu . All rights reserved.
http://www.codingnow.com http://www.codingnow.com
Use, modification and distribution are subject to the "New BSD License" Use, modification and distribution are subject to the "New BSD License"
as listed at <url: http://www.opensource.org/licenses/bsd-license.php >. as listed at <url: http://www.opensource.org/licenses/bsd-license.php >.
filename: backtrace.c filename: backtrace.c
compiler: gcc 3.4.5 (mingw-win32) build command: gcc -O2 -shared -Wall -o backtrace.dll backtrace.c -lbfd -liberty -limagehlp
build command: gcc -O2 -shared -Wall -o backtrace.dll backtrace.c -lbfd -liberty -limagehlp
how to use: Call LoadLibraryA("backtrace.dll"); at beginning of your program . how to use: Call LoadLibraryA("backtrace.dll"); at beginning of your program .
@ -19,10 +17,25 @@
/* modified from original for EDuke32 */ /* modified from original for EDuke32 */
// warnings cleaned up and ported to 64-bit by Hendricks266
#define CRASH_LOG_FILE "eduke32_or_mapster32.crashlog"
#include <windows.h> #include <windows.h>
#include <excpt.h> #include <excpt.h>
#include <imagehlp.h> #include <imagehlp.h>
// Tenuous: MinGW provides _IMAGEHLP_H while MinGW-w64 defines _IMAGEHLP_.
#ifdef _IMAGEHLP_H
# define EBACKTRACE_MINGW32
#endif
#ifdef _IMAGEHLP_
# define EBACKTRACE_MINGW_W64
#endif
#if defined(EBACKTRACE_MINGW32) && !defined(EBACKTRACE_MINGW_W64)
# include "_dbg_common.h"
#endif
#ifndef PACKAGE #ifndef PACKAGE
# define PACKAGE EBACKTRACE1 # define PACKAGE EBACKTRACE1
#endif #endif
@ -45,6 +58,7 @@
#include <stdint.h> #include <stdint.h>
#if defined __GNUC__ || defined __clang__ #if defined __GNUC__ || defined __clang__
# define ATTRIBUTE(attrlist) __attribute__(attrlist) # define ATTRIBUTE(attrlist) __attribute__(attrlist)
#else #else
@ -102,7 +116,7 @@ output_print(struct output_buffer *ob, const char * format, ...)
ob->ptr = strlen(ob->buf + ob->ptr) + ob->ptr; ob->ptr = strlen(ob->buf + ob->ptr) + ob->ptr;
} }
static void static void
lookup_section(bfd *abfd, asection *sec, void *opaque_data) lookup_section(bfd *abfd, asection *sec, void *opaque_data)
{ {
struct find_info *data = opaque_data; struct find_info *data = opaque_data;
@ -111,11 +125,11 @@ lookup_section(bfd *abfd, asection *sec, void *opaque_data)
if (data->func) if (data->func)
return; return;
if (!(bfd_get_section_flags(abfd, sec) & SEC_ALLOC)) if (!(bfd_get_section_flags(abfd, sec) & SEC_ALLOC))
return; return;
vma = bfd_get_section_vma(abfd, sec); vma = bfd_get_section_vma(abfd, sec);
if (data->counter < vma || vma + bfd_get_section_size(sec) <= data->counter) if (data->counter < vma || vma + bfd_get_section_size(sec) <= data->counter)
return; return;
bfd_find_nearest_line(abfd, sec, data->symbol, data->counter - vma, &(data->file), &(data->func), &(data->line)); bfd_find_nearest_line(abfd, sec, data->symbol, data->counter - vma, &(data->file), &(data->func), &(data->line));
@ -233,12 +247,18 @@ release_set(struct bfd_set *set)
static char procname[MAX_PATH]; static char procname[MAX_PATH];
#if defined(_M_X64) || defined(__amd64__) || defined(__x86_64__)
# define MachineType IMAGE_FILE_MACHINE_AMD64
#else
# define MachineType IMAGE_FILE_MACHINE_I386
#endif
static void static void
_backtrace(struct output_buffer *ob, struct bfd_set *set, int depth , LPCONTEXT context) _backtrace(struct output_buffer *ob, struct bfd_set *set, int depth , LPCONTEXT context)
{ {
STACKFRAME frame; STACKFRAME64 frame;
HANDLE process, thread; HANDLE process, thread;
char symbol_buffer[sizeof(IMAGEHLP_SYMBOL) + 255]; char symbol_buffer[sizeof(IMAGEHLP_SYMBOL64) + 255];
char module_name_raw[MAX_PATH]; char module_name_raw[MAX_PATH];
struct bfd_ctx *bc = NULL; struct bfd_ctx *bc = NULL;
@ -246,26 +266,33 @@ _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__)
frame.AddrPC.Offset = context->Rip;
frame.AddrStack.Offset = context->Rsp;
frame.AddrFrame.Offset = context->Rbp;
#else
frame.AddrPC.Offset = context->Eip; frame.AddrPC.Offset = context->Eip;
frame.AddrPC.Mode = AddrModeFlat;
frame.AddrStack.Offset = context->Esp; frame.AddrStack.Offset = context->Esp;
frame.AddrStack.Mode = AddrModeFlat;
frame.AddrFrame.Offset = context->Ebp; frame.AddrFrame.Offset = context->Ebp;
#endif
frame.AddrPC.Mode = AddrModeFlat;
frame.AddrStack.Mode = AddrModeFlat;
frame.AddrFrame.Mode = AddrModeFlat; frame.AddrFrame.Mode = AddrModeFlat;
process = GetCurrentProcess(); process = GetCurrentProcess();
thread = GetCurrentThread(); thread = GetCurrentThread();
while(StackWalk(IMAGE_FILE_MACHINE_I386, while(StackWalk64(MachineType,
process, process,
thread, thread,
&frame, &frame,
context, context,
0, NULL,
SymFunctionTableAccess, SymFunctionTableAccess64,
SymGetModuleBase, 0)) { SymGetModuleBase64, NULL)) {
IMAGEHLP_SYMBOL *symbol; IMAGEHLP_SYMBOL64 *symbol;
DWORD module_base; DWORD64 module_base;
const char * module_name = "[unknown module]"; const char * module_name = "[unknown module]";
const char * file = NULL; const char * file = NULL;
@ -276,14 +303,14 @@ _backtrace(struct output_buffer *ob, struct bfd_set *set, int depth , LPCONTEXT
if (depth < 0) if (depth < 0)
break; break;
symbol = (IMAGEHLP_SYMBOL *)symbol_buffer; symbol = (IMAGEHLP_SYMBOL64 *)symbol_buffer;
symbol->SizeOfStruct = (sizeof *symbol) + 255; symbol->SizeOfStruct = (sizeof *symbol) + 255;
symbol->MaxNameLength = 254; symbol->MaxNameLength = 254;
module_base = SymGetModuleBase(process, frame.AddrPC.Offset); module_base = SymGetModuleBase64(process, frame.AddrPC.Offset);
if (module_base && if (module_base &&
GetModuleFileNameA((HINSTANCE)module_base, module_name_raw, MAX_PATH)) { GetModuleFileNameA((HINSTANCE)(intptr_t)module_base, module_name_raw, MAX_PATH)) {
module_name = module_name_raw; module_name = module_name_raw;
bc = get_bc(ob, set, module_name); bc = get_bc(ob, set, module_name);
} }
@ -293,8 +320,8 @@ _backtrace(struct output_buffer *ob, struct bfd_set *set, int depth , LPCONTEXT
} }
if (file == NULL) { if (file == NULL) {
DWORD dummy = 0; DWORD64 dummy = 0;
if (SymGetSymFromAddr(process, frame.AddrPC.Offset, &dummy, symbol)) { if (SymGetSymFromAddr64(process, frame.AddrPC.Offset, &dummy, symbol)) {
file = symbol->Name; file = symbol->Name;
} }
else { else {
@ -302,13 +329,13 @@ _backtrace(struct output_buffer *ob, struct bfd_set *set, int depth , LPCONTEXT
} }
} }
if (func == NULL) { if (func == NULL) {
output_print(ob,"0x%x : %s : %s \n", output_print(ob,"0x%x : %s : %s \n",
frame.AddrPC.Offset, frame.AddrPC.Offset,
module_name, module_name,
file); file);
} }
else { else {
output_print(ob,"0x%x : %s : %s (%d) : in function (%s) \n", output_print(ob,"0x%x : %s : %s (%d) : in function (%s) \n",
frame.AddrPC.Offset, frame.AddrPC.Offset,
module_name, module_name,
file, file,
@ -321,7 +348,7 @@ _backtrace(struct output_buffer *ob, struct bfd_set *set, int depth , LPCONTEXT
static char * g_output = NULL; static char * g_output = NULL;
static LPTOP_LEVEL_EXCEPTION_FILTER g_prev = NULL; static LPTOP_LEVEL_EXCEPTION_FILTER g_prev = NULL;
static LONG WINAPI static LONG WINAPI
exception_filter(LPEXCEPTION_POINTERS info) exception_filter(LPEXCEPTION_POINTERS info)
{ {
struct output_buffer ob; struct output_buffer ob;
@ -340,7 +367,7 @@ exception_filter(LPEXCEPTION_POINTERS info)
SymCleanup(GetCurrentProcess()); SymCleanup(GetCurrentProcess());
} }
logfd = open("eduke32_or_mapster32.crashlog", 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);
if (logfd) { if (logfd) {
time_t curtime; time_t curtime;
@ -389,7 +416,7 @@ backtrace_unregister(void)
} }
} }
BOOL WINAPI BOOL WINAPI
DllMain(HANDLE hinstDLL ATTRIBUTE((unused)), DWORD dwReason, LPVOID lpvReserved ATTRIBUTE((unused))) DllMain(HANDLE hinstDLL ATTRIBUTE((unused)), DWORD dwReason, LPVOID lpvReserved ATTRIBUTE((unused)))
{ {
switch (dwReason) { switch (dwReason) {

Binary file not shown.

View file

@ -11,7 +11,7 @@ clean=veryclean
# the following file paths are relative to $source # the following file paths are relative to $source
targets=( eduke32.exe mapster32.exe ) targets=( eduke32.exe mapster32.exe )
package=package package=package
not_src_packaged=( psd source/jaudiolib/third-party/vorbis.framework/Versions/A/vorbis Apple/lib $package/ebacktrace1.dll ) not_src_packaged=( psd source/jaudiolib/third-party/vorbis.framework/Versions/A/vorbis Apple/lib )
# group that owns the resulting packages # group that owns the resulting packages
group=dukeworld group=dukeworld