Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/zbxwin32/fatal.c')
-rw-r--r--src/libs/zbxwin32/fatal.c65
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 ...",