diff options
Diffstat (limited to 'src/libs/zbxwin32/fatal.c')
-rw-r--r-- | src/libs/zbxwin32/fatal.c | 65 |
1 files changed, 35 insertions, 30 deletions
diff --git a/src/libs/zbxwin32/fatal.c b/src/libs/zbxwin32/fatal.c index 9e040c6dca5..7c684fb9615 100644 --- a/src/libs/zbxwin32/fatal.c +++ b/src/libs/zbxwin32/fatal.c @@ -17,6 +17,8 @@ ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ +#include "zbxwin32.h" + #include "zbxstr.h" #include "log.h" @@ -25,28 +27,35 @@ #pragma comment(lib, "DbgHelp.lib") -#define STACKWALK_MAX_NAMELEN 4096 - -#define ZBX_LSHIFT(value, bits) (((unsigned __int64)value) << bits) - -extern const char *progname; +typedef BOOL (WINAPI *SymGetLineFromAddrW64_func_t)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64); +typedef BOOL (WINAPI *SymFromAddr_func_t)(HANDLE a, DWORD64 b , PDWORD64 c, PSYMBOL_INFO d); #ifdef _M_X64 - -#define ZBX_IMAGE_FILE_MACHINE IMAGE_FILE_MACHINE_AMD64 - static void print_register(const char *name, unsigned __int64 value) { zabbix_log(LOG_LEVEL_CRIT, "%-7s = %16I64x = %20I64u = %20I64d", name, value, value, value); } +#else +static void print_register(const char *name, unsigned __int32 value) +{ + zabbix_log(LOG_LEVEL_CRIT, "%-7s = %16lx = %20lu = %20ld", name, value, value, value); +} +#endif static void print_fatal_info(CONTEXT *pctx) { zabbix_log(LOG_LEVEL_CRIT, "====== Fatal information: ======"); +#ifdef _M_X64 zabbix_log(LOG_LEVEL_CRIT, "Program counter: 0x%08lx", pctx->Rip); +#else + zabbix_log(LOG_LEVEL_CRIT, "Program counter: 0x%04x", pctx->Eip); +#endif zabbix_log(LOG_LEVEL_CRIT, "=== Registers: ==="); +#define ZBX_LSHIFT(value, bits) (((unsigned __int64)value) << bits) + +#ifdef _M_X64 print_register("r8", pctx->R8); print_register("r9", pctx->R9); print_register("r10", pctx->R10); @@ -68,24 +77,7 @@ static void print_fatal_info(CONTEXT *pctx) print_register("rsp", pctx->Rsp); print_register("efl", pctx->EFlags); print_register("csgsfs", ZBX_LSHIFT(pctx->SegCs, 24) | ZBX_LSHIFT(pctx->SegGs, 16) | ZBX_LSHIFT(pctx->SegFs, 8)); -} - #else - -#define ZBX_IMAGE_FILE_MACHINE IMAGE_FILE_MACHINE_I386 - -static void print_register(const char *name, unsigned __int32 value) -{ - zabbix_log(LOG_LEVEL_CRIT, "%-7s = %16lx = %20lu = %20ld", name, value, value, value); -} - -static void print_fatal_info(CONTEXT *pctx) -{ - zabbix_log(LOG_LEVEL_CRIT, "====== Fatal information: ======"); - - zabbix_log(LOG_LEVEL_CRIT, "Program counter: 0x%04x", pctx->Eip); - zabbix_log(LOG_LEVEL_CRIT, "=== Registers: ==="); - print_register("edi", pctx->Edi); print_register("esi", pctx->Esi); print_register("ebp", pctx->Ebp); @@ -98,12 +90,12 @@ static void print_fatal_info(CONTEXT *pctx) print_register("esp", pctx->Esp); print_register("efl", pctx->EFlags); print_register("csgsfs", ZBX_LSHIFT(pctx->SegCs, 24) | ZBX_LSHIFT(pctx->SegGs, 16) | ZBX_LSHIFT(pctx->SegFs, 8)); -} - #endif -typedef BOOL (WINAPI *SymGetLineFromAddrW64_func_t)(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64); -typedef BOOL (WINAPI *SymFromAddr_func_t)(HANDLE a, DWORD64 b , PDWORD64 c, PSYMBOL_INFO d); +#undef ZBX_LSHIFT +} + +static zbx_get_progname_f get_progname_cb = NULL; void zbx_backtrace(void) { @@ -154,7 +146,7 @@ static void print_backtrace(CONTEXT *pctx) process_name = zbx_unicode_to_utf8(szProcessName); - if (NULL != (ptr = strstr(process_name, progname))) + if (NULL != (ptr = strstr(process_name, get_progname_cb()))) zbx_strncpy_alloc(&process_path, &path_alloc, &path_offset, process_name, ptr - process_name); } @@ -181,6 +173,12 @@ static void print_backtrace(CONTEXT *pctx) scount = s; ctxcount = ctx; +#ifdef _M_X64 +#define ZBX_IMAGE_FILE_MACHINE IMAGE_FILE_MACHINE_AMD64 +#else +#define ZBX_IMAGE_FILE_MACHINE IMAGE_FILE_MACHINE_I386 +#endif + /* get number of frames, ctxcount may be modified during StackWalk64() calls */ while (TRUE == StackWalk64(ZBX_IMAGE_FILE_MACHINE, hProcess, hThread, &scount, &ctxcount, NULL, NULL, NULL, NULL)) @@ -223,6 +221,8 @@ static void print_backtrace(CONTEXT *pctx) break; } +#undef ZBX_IMAGE_FILE_MACHINE + SymCleanup(hProcess); zbx_free(frame); @@ -231,6 +231,11 @@ static void print_backtrace(CONTEXT *pctx) zbx_free(pSym); } +void zbx_init_library_win32(zbx_get_progname_f get_progname) +{ + get_progname_cb = get_progname; +} + int zbx_win_exception_filter(struct _EXCEPTION_POINTERS *ep) { zabbix_log(LOG_LEVEL_CRIT, "Unhandled exception %x detected at 0x%p. Crashing ...", |