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:
-rw-r--r--.gitattributes1
-rw-r--r--build/win32/project/Makefile_agent7
-rw-r--r--build/win32/project/Makefile_agent.inc10
-rw-r--r--build/win32/project/Makefile_agent_x645
-rw-r--r--build/win32/project/Makefile_get.inc6
-rw-r--r--build/win32/project/Makefile_sender.inc7
-rw-r--r--include/threads.h3
-rw-r--r--src/libs/zbxsys/threads.c21
-rw-r--r--src/libs/zbxwin32/fatal.c240
-rw-r--r--src/zabbix_agent/active.c2
10 files changed, 288 insertions, 14 deletions
diff --git a/.gitattributes b/.gitattributes
index c05f0a402f1..a76b3633513 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -511,6 +511,7 @@ misc/init.d/tru64/zabbix_server -text
src/libs/zbxdbcache/macrocache.c -text
src/libs/zbxdbcache/macrocache.h -text
src/libs/zbxsysinfo/win32/wmi.cpp -text
+src/libs/zbxwin32/fatal.c -text
src/zabbix_java/lib/README svneol=native#text/plain
src/zabbix_java/lib/android-json-4.3_r3.1.jar -text
src/zabbix_java/lib/logback-classic-0.9.27.jar -text
diff --git a/build/win32/project/Makefile_agent b/build/win32/project/Makefile_agent
index f8aebf5474f..0db9f13c5cf 100644
--- a/build/win32/project/Makefile_agent
+++ b/build/win32/project/Makefile_agent
@@ -1,8 +1,9 @@
PROGNAME = ..\..\..\bin\win32\zabbix_agentd.exe
+PDBNAME = ..\..\..\bin\win32\zabbix_agentd.pdb
INCS = /I .\ /I ..\include /I ..\..\..\include /I ..\..\..\src\zabbix_agent
-COMMON_FLAGS = $(INCS) /O2 /Ob1 /GF /FD /EHsc /MT /Gy /W3 /c /D _WINDOWS /D _WIN32_WINNT=0x0500 /D _CONSOLE /D UNICODE /D _UNICODE /D NDEBUG /D WIN32 /D HAVE_WINLDAP_H /D HAVE_ASSERT_H /D ZABBIX_SERVICE /D WITH_AGENT_METRICS /D WITH_COMMON_METRICS /D WITH_SPECIFIC_METRICS /D WITH_HOSTNAME_METRIC /D WITH_SIMPLE_METRICS /D "_VC80_UPGRADE=0x0600" /D HAVE_IPV6
-CFLAGS = $(COMMON_FLAGS) /TC
+COMMON_FLAGS = $(INCS) /O2 /Ob1 /GF /FD /EHsc /MT /Gy /W3 /c /Zi /Fdzabbix_agentd.pdb /D _WINDOWS /D _WIN32_WINNT=0x0500 /D _CONSOLE /D UNICODE /D _UNICODE /D NDEBUG /D WIN32 /D HAVE_WINLDAP_H /D HAVE_ASSERT_H /D ZABBIX_SERVICE /D WITH_AGENT_METRICS /D WITH_COMMON_METRICS /D WITH_SPECIFIC_METRICS /D WITH_HOSTNAME_METRIC /D WITH_SIMPLE_METRICS /D "_VC80_UPGRADE=0x0600" /D HAVE_IPV6
+CFLAGS = $(COMMON_FLAGS) /TC
CPPFLAGS = $(COMMON_FLAGS) /TP
-LFLAGS = /INCREMENTAL:NO /MANIFEST /MANIFESTFILE:"zabbix_agentd.exe.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /PDB:"zabbix_agentd.pdb" /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /MACHINE:X86 /DELAYLOAD:wevtapi.dll
+LFLAGS = /INCREMENTAL:NO /DEBUG /OPT:REF /MANIFEST /MANIFESTFILE:"zabbix_agentd.exe.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /MACHINE:X86 /DELAYLOAD:wevtapi.dll
include Makefile_agent.inc
diff --git a/build/win32/project/Makefile_agent.inc b/build/win32/project/Makefile_agent.inc
index 9106d347b98..cd07bf35d61 100644
--- a/build/win32/project/Makefile_agent.inc
+++ b/build/win32/project/Makefile_agent.inc
@@ -66,17 +66,18 @@ OBJS = ..\..\..\src\libs\zbxalgo\algodefs.o \
..\..\..\src\zabbix_agent\zabbix_agentd.o \
..\..\..\src\zabbix_agent\zbxconf.o \
..\..\..\src\libs\zbxregexp\gnuregex.o \
- ..\..\..\src\libs\zbxregexp\zbxregexp.o
+ ..\..\..\src\libs\zbxregexp\zbxregexp.o \
+ ..\..\..\src\libs\zbxwin32\fatal.o
LIBS = ws2_32.lib psapi.lib pdh.lib Wldap32.lib advapi32.lib uuid.lib Iphlpapi.lib delayimp.lib wevtapi.lib
all: $(PROGNAME)
clean:
- del $(OBJS) $(RESOURCE_RES) $(MESSAGES_H) $(PROGNAME) messages.rc MSG00001.bin zabbix_agentd.exe.manifest
+ del $(OBJS) $(RESOURCE_RES) $(MESSAGES_H) $(PROGNAME) messages.rc MSG00001.bin zabbix_agentd.exe.manifest *.idb *.pdb
$(PROGNAME): $(MESSAGES_H) $(OBJS) $(RESOURCE_RES)
- $(LINKER) $(OBJS) $(RESOURCE_RES) /OUT:$(PROGNAME) $(LFLAGS) $(LIBS)
+ $(LINKER) $(OBJS) $(RESOURCE_RES) /OUT:$(PROGNAME) /PDB:$(PDBNAME) $(LFLAGS) $(LIBS)
$(MT) /outputresource:"$(PROGNAME);#1" /manifest zabbix_agentd.exe.manifest /nologo
$(MESSAGES_H): messages.mc
@@ -262,4 +263,5 @@ $(RESOURCE_RES): $(RESOURCE_RC) $(RESOURCE_H) $(DESC_H)
..\..\..\src\zabbix_agent\zbxconf.o: ..\..\..\src\zabbix_agent\zbxconf.c
$(CC) ..\..\..\src\zabbix_agent\zbxconf.c /Fo"..\..\..\src\zabbix_agent\zbxconf.o" $(CFLAGS)
-
+..\..\..\src\libs\zbxwin32\fatal.o: ..\..\..\src\libs\zbxwin32\fatal.c
+ $(CC) ..\..\..\src\libs\zbxwin32\fatal.c /Fo"..\..\..\src\libs\zbxwin32\fatal.o" $(CFLAGS)
diff --git a/build/win32/project/Makefile_agent_x64 b/build/win32/project/Makefile_agent_x64
index aa16ccd3dd9..c31b9ac9c64 100644
--- a/build/win32/project/Makefile_agent_x64
+++ b/build/win32/project/Makefile_agent_x64
@@ -1,8 +1,9 @@
PROGNAME = ..\..\..\bin\win64\zabbix_agentd.exe
+PDBNAME = ..\..\..\bin\win64\zabbix_agentd.pdb
INCS = /I .\ /I ..\include /I ..\..\..\include /I ..\..\..\src\zabbix_agent
-COMMON_FLAGS = $(INCS) /O2 /Ob1 /GF /FD /EHsc /MT /Gy /W3 /c /D _WINDOWS /D _WIN32_WINNT=0x0500 /D _CONSOLE /D UNICODE /D _UNICODE /D NDEBUG /D WIN32 /D HAVE_WINLDAP_H /D HAVE_ASSERT_H /D ZABBIX_SERVICE /D WITH_AGENT_METRICS /D WITH_COMMON_METRICS /D WITH_SPECIFIC_METRICS /D WITH_HOSTNAME_METRIC /D WITH_SIMPLE_METRICS /D "_VC80_UPGRADE=0x0600" /D HAVE_IPV6
+COMMON_FLAGS = $(INCS) /O2 /Ob1 /GF /FD /EHsc /MT /Gy /W3 /c /Zi /Fdzabbix_agentd.pdb /D _WINDOWS /D _WIN32_WINNT=0x0500 /D _CONSOLE /D UNICODE /D _UNICODE /D NDEBUG /D WIN32 /D HAVE_WINLDAP_H /D HAVE_ASSERT_H /D ZABBIX_SERVICE /D WITH_AGENT_METRICS /D WITH_COMMON_METRICS /D WITH_SPECIFIC_METRICS /D WITH_HOSTNAME_METRIC /D WITH_SIMPLE_METRICS /D "_VC80_UPGRADE=0x0600" /D HAVE_IPV6
CFLAGS = $(COMMON_FLAGS) /TC
CPPFLAGS = $(COMMON_FLAGS) /TP
-LFLAGS = /INCREMENTAL:NO /MANIFEST /MANIFESTFILE:"zabbix_agentd.exe.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /PDB:"zabbix_agentd.pdb" /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /MACHINE:X64 /DELAYLOAD:wevtapi.dll
+LFLAGS = /INCREMENTAL:NO /DEBUG /OPT:REF /MANIFEST /MANIFESTFILE:"zabbix_agentd.exe.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /MACHINE:X64 /DELAYLOAD:wevtapi.dll
include Makefile_agent.inc
diff --git a/build/win32/project/Makefile_get.inc b/build/win32/project/Makefile_get.inc
index c136db6c04b..71af119a9dc 100644
--- a/build/win32/project/Makefile_get.inc
+++ b/build/win32/project/Makefile_get.inc
@@ -20,7 +20,8 @@ OBJS = ..\..\..\src\libs\zbxcommon\comms.o \
..\..\..\src\libs\zbxsys\mutexs.o \
..\..\..\src\libs\zbxsys\symbols.o \
..\..\..\src\libs\zbxsys\threads.o \
- ..\..\..\src\zabbix_get\zabbix_get.o
+ ..\..\..\src\zabbix_get\zabbix_get.o \
+ ..\..\..\src\libs\zbxwin32\fatal.o
LIBS = ws2_32.lib psapi.lib pdh.lib Wldap32.lib advapi32.lib uuid.lib Iphlpapi.lib
@@ -77,3 +78,6 @@ $(RESOURCE_RES): $(RESOURCE_RC) $(RESOURCE_H) $(DESC_H)
..\..\..\src\zabbix_get\zabbix_get.o: ..\..\..\src\zabbix_get\zabbix_get.c
$(CC) ..\..\..\src\zabbix_get\zabbix_get.c /Fo"..\..\..\src\zabbix_get\zabbix_get.o" $(CFLAGS)
+
+..\..\..\src\libs\zbxwin32\fatal.o: ..\..\..\src\libs\zbxwin32\fatal.c
+ $(CC) ..\..\..\src\libs\zbxwin32\fatal.c /Fo"..\..\..\src\libs\zbxwin32\fatal.o" $(CFLAGS)
diff --git a/build/win32/project/Makefile_sender.inc b/build/win32/project/Makefile_sender.inc
index 836ee40de41..49907703d69 100644
--- a/build/win32/project/Makefile_sender.inc
+++ b/build/win32/project/Makefile_sender.inc
@@ -22,7 +22,8 @@ OBJS = ..\..\..\src\libs\zbxcommon\comms.o \
..\..\..\src\libs\zbxsys\mutexs.o \
..\..\..\src\libs\zbxsys\symbols.o \
..\..\..\src\libs\zbxsys\threads.o \
- ..\..\..\src\zabbix_sender\$(SENDER_MAIN_OBJ)
+ ..\..\..\src\zabbix_sender\$(SENDER_MAIN_OBJ) \
+ ..\..\..\src\libs\zbxwin32\fatal.o
LIBS = ws2_32.lib psapi.lib pdh.lib Wldap32.lib advapi32.lib uuid.lib Iphlpapi.lib
@@ -91,3 +92,7 @@ $(RESOURCE_RES): $(RESOURCE_RC) $(RESOURCE_H) $(DESC_H)
..\..\..\src\zabbix_sender\win32\zabbix_sender.o: ..\..\..\src\zabbix_sender\win32\zabbix_sender.c
$(CC) ..\..\..\src\zabbix_sender\win32\zabbix_sender.c /Fo"..\..\..\src\zabbix_sender\win32\zabbix_sender.o" $(CFLAGS)
+
+..\..\..\src\libs\zbxwin32\fatal.o: ..\..\..\src\libs\zbxwin32\fatal.c
+ $(CC) ..\..\..\src\libs\zbxwin32\fatal.c /Fo"..\..\..\src\libs\zbxwin32\fatal.o" $(CFLAGS)
+
diff --git a/include/threads.h b/include/threads.h
index af78924054f..e25c028904f 100644
--- a/include/threads.h
+++ b/include/threads.h
@@ -78,6 +78,9 @@ typedef struct
int process_num;
unsigned char process_type;
void *args;
+#ifdef _WINDOWS
+ ZBX_THREAD_ENTRY_POINTER(entry);
+#endif
}
zbx_thread_args_t;
diff --git a/src/libs/zbxsys/threads.c b/src/libs/zbxsys/threads.c
index 0362a60c7a7..8701ad90998 100644
--- a/src/libs/zbxsys/threads.c
+++ b/src/libs/zbxsys/threads.c
@@ -65,6 +65,24 @@ int zbx_child_fork()
return pid;
}
+
+#else
+int zbx_win_exception_filter(unsigned int code, struct _EXCEPTION_POINTERS *ep);
+
+static ZBX_THREAD_ENTRY(zbx_win_thread_entry, args)
+{
+ __try
+ {
+ zbx_thread_args_t *thread_args = (zbx_thread_args_t *)args;
+
+ return thread_args->entry(thread_args);
+ }
+ __except(zbx_win_exception_filter(GetExceptionCode(), GetExceptionInformation()))
+ {
+ zbx_thread_exit(EXIT_SUCCESS);
+ }
+}
+
#endif
/******************************************************************************
@@ -89,8 +107,9 @@ ZBX_THREAD_HANDLE zbx_thread_start(ZBX_THREAD_ENTRY_POINTER(handler), zbx_thread
#ifdef _WINDOWS
unsigned thrdaddr;
+ thread_args->entry = handler;
/* NOTE: _beginthreadex returns 0 on failure, rather than 1 */
- if (0 == (thread = (ZBX_THREAD_HANDLE)_beginthreadex(NULL, 0, handler, thread_args, 0, &thrdaddr)))
+ if (0 == (thread = (ZBX_THREAD_HANDLE)_beginthreadex(NULL, 0, zbx_win_thread_entry, thread_args, 0, &thrdaddr)))
{
zabbix_log(LOG_LEVEL_CRIT, "failed to create a thread: %s", strerror_from_system(GetLastError()));
thread = (ZBX_THREAD_HANDLE)ZBX_THREAD_ERROR;
diff --git a/src/libs/zbxwin32/fatal.c b/src/libs/zbxwin32/fatal.c
new file mode 100644
index 00000000000..0a721760e19
--- /dev/null
+++ b/src/libs/zbxwin32/fatal.c
@@ -0,0 +1,240 @@
+/*
+** Zabbix
+** Copyright (C) 2001-2014 Zabbix SIA
+**
+** This program is free software; you can redistribute it and/or modify
+** it under the terms of the GNU General Public License as published by
+** the Free Software Foundation; either version 2 of the License, or
+** (at your option) any later version.
+**
+** This program is distributed in the hope that it will be useful,
+** but WITHOUT ANY WARRANTY; without even the implied warranty of
+** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+** GNU General Public License for more details.
+**
+** You should have received a copy of the GNU General Public License
+** along with this program; if not, write to the Free Software
+** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+**/
+
+#include "common.h"
+#include "log.h"
+
+#include <excpt.h>
+#include <DbgHelp.h>
+
+#pragma comment(lib, "DbgHelp.lib")
+
+#define STACKWALK_MAX_NAMELEN 4096
+
+#define ZBX_LSHIFT(value, bits) (((unsigned __int64)value) << bits)
+
+#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);
+}
+
+static void print_fatal_info(CONTEXT *pctx)
+{
+ zabbix_log(LOG_LEVEL_CRIT, "====== Fatal information: ======");
+
+ zabbix_log(LOG_LEVEL_CRIT, "Program counter: 0x%08lx", pctx->Rip);
+ zabbix_log(LOG_LEVEL_CRIT, "=== Registers: ===");
+
+ print_register("r8", pctx->R8);
+ print_register("r9", pctx->R9);
+ print_register("r10", pctx->R10);
+ print_register("r11", pctx->R11);
+ print_register("r12", pctx->R12);
+ print_register("r13", pctx->R13);
+ print_register("r14", pctx->R14);
+ print_register("r15", pctx->R15);
+
+ print_register("rdi", pctx->Rdi);
+ print_register("rsi", pctx->Rsi);
+ print_register("rbp", pctx->Rbp);
+
+ print_register("rbx", pctx->Rbx);
+ print_register("rdx", pctx->Rdx);
+ print_register("rax", pctx->Rax);
+ print_register("rcx", pctx->Rcx);
+
+ 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);
+
+ print_register("ebx", pctx->Ebx);
+ print_register("edx", pctx->Edx);
+ print_register("eax", pctx->Eax);
+ print_register("ecx", pctx->Ecx);
+
+ 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);
+
+static void print_backtrace(CONTEXT *pctx)
+{
+ SymGetLineFromAddrW64_func_t zbx_SymGetLineFromAddrW64 = NULL;
+ SymFromAddr_func_t zbx_SymFromAddr = NULL;
+
+ CONTEXT ctx, ctxcount;
+ STACKFRAME64 s, scount;
+ PSYMBOL_INFO pSym = NULL;
+ HMODULE hModule;
+ HANDLE hProcess, hThread;
+ DWORD64 offset;
+ wchar_t szProcessName[MAX_PATH];
+ char *process_name = NULL, *process_path = NULL, *frame = NULL;
+ size_t frame_alloc = 0, frame_offset;
+ int nframes = 0;
+
+ ctx = *pctx;
+
+ zabbix_log(LOG_LEVEL_CRIT, "=== Backtrace: ===");
+
+ memset(&s, 0, sizeof(s));
+
+ s.AddrPC.Mode = AddrModeFlat;
+ s.AddrFrame.Mode = AddrModeFlat;
+ s.AddrStack.Mode = AddrModeFlat;
+
+#ifdef _M_X64
+ s.AddrPC.Offset = ctx.Rip;
+ s.AddrFrame.Offset = ctx.Rbp;
+ s.AddrStack.Offset = ctx.Rsp;
+#else
+ s.AddrPC.Offset = ctx.Eip;
+ s.AddrFrame.Offset = ctx.Ebp;
+ s.AddrStack.Offset = ctx.Esp;
+#endif
+ hProcess = GetCurrentProcess();
+ hThread = GetCurrentThread();
+
+ if (0 != GetModuleFileNameEx(hProcess, NULL, szProcessName, ARRSIZE(szProcessName)))
+ {
+ char *ptr;
+ extern const char *progname;
+ int path_alloc = 0, path_offset = 0;
+
+ process_name = zbx_unicode_to_utf8(szProcessName);
+
+ if (NULL != (ptr = strstr(process_name, progname)))
+ zbx_strncpy_alloc(&process_path, &path_alloc, &path_offset, process_name, ptr - process_name);
+ }
+
+ if (NULL != (hModule = GetModuleHandle(TEXT("DbgHelp.DLL"))))
+ {
+ zbx_SymGetLineFromAddrW64 = (SymGetLineFromAddrW64_func_t)GetProcAddress(hModule,
+ "SymGetLineFromAddr64");
+ zbx_SymFromAddr = (SymFromAddr_func_t)GetProcAddress(hModule, "SymFromAddr");
+ }
+
+ if (NULL != zbx_SymFromAddr || NULL != zbx_SymGetLineFromAddrW64)
+ {
+ SymSetOptions(SymGetOptions() | SYMOPT_LOAD_LINES);
+
+ if (FALSE != SymInitialize(hProcess, process_path, TRUE))
+ {
+ pSym = (PSYMBOL_INFO) zbx_malloc(NULL, sizeof(SYMBOL_INFO) + MAX_SYM_NAME);
+ memset(pSym, 0, sizeof(SYMBOL_INFO) + MAX_SYM_NAME);
+ pSym->SizeOfStruct = sizeof(SYMBOL_INFO);
+ pSym->MaxNameLen = MAX_SYM_NAME;
+ }
+ }
+
+ scount = s;
+ ctxcount = ctx;
+
+ /* 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))
+ {
+ if (0 == scount.AddrReturn.Offset)
+ break;
+ nframes++;
+ }
+
+ while (TRUE == StackWalk64(ZBX_IMAGE_FILE_MACHINE, hProcess, hThread, &s, &ctx, NULL, NULL, NULL, NULL))
+ {
+ frame_offset = 0;
+ zbx_snprintf_alloc(&frame, &frame_alloc, &frame_offset, "%d: %s", nframes--,
+ NULL == process_name ? "(unknown)" : process_name);
+
+ if (NULL != pSym)
+ {
+ DWORD dwDisplacement;
+ IMAGEHLP_LINE64 line = {sizeof(IMAGEHLP_LINE64)};
+
+ zbx_chrcpy_alloc(&frame, &frame_alloc, &frame_offset, '(');
+ if (NULL != zbx_SymFromAddr &&
+ TRUE == zbx_SymFromAddr(hProcess, s.AddrPC.Offset, &offset, pSym))
+ {
+ zbx_snprintf_alloc(&frame, &frame_alloc, &frame_offset, "%s+0x%lx", pSym->Name, offset);
+ }
+
+ if (NULL != zbx_SymGetLineFromAddrW64 && TRUE == zbx_SymGetLineFromAddrW64(hProcess,
+ s.AddrPC.Offset, &dwDisplacement, &line))
+ {
+ zbx_snprintf_alloc(&frame, &frame_alloc, &frame_offset, " %s:%d", line.FileName,
+ line.LineNumber);
+ }
+ zbx_chrcpy_alloc(&frame, &frame_alloc, &frame_offset, ')');
+ }
+
+ zabbix_log(LOG_LEVEL_CRIT, "%s [0x%lx]", frame, s.AddrPC.Offset);
+
+ if (0 == s.AddrReturn.Offset)
+ break;
+ }
+
+ SymCleanup(hProcess);
+
+ zbx_free(frame);
+ zbx_free(process_path);
+ zbx_free(process_name);
+ zbx_free(pSym);
+}
+
+int zbx_win_exception_filter(unsigned int code, struct _EXCEPTION_POINTERS *ep)
+{
+ zabbix_log(LOG_LEVEL_CRIT, "Unhandled exception %x detected at 0x%p. Crashing ...", code,
+ ep->ExceptionRecord->ExceptionAddress);
+
+ print_fatal_info(ep->ContextRecord);
+ print_backtrace(ep->ContextRecord);
+
+ zabbix_log(LOG_LEVEL_CRIT, "================================");
+
+ return EXCEPTION_CONTINUE_SEARCH;
+}
diff --git a/src/zabbix_agent/active.c b/src/zabbix_agent/active.c
index 007aacb6b42..e49bddf8962 100644
--- a/src/zabbix_agent/active.c
+++ b/src/zabbix_agent/active.c
@@ -73,8 +73,6 @@ LONG WINAPI DelayLoadDllExceptionFilter(PEXCEPTION_POINTERS excpointers)
}
break;
default:
- zabbix_log(LOG_LEVEL_DEBUG, "unexpected exception [%08X] in process_eventlog()",
- excpointers->ExceptionRecord->ExceptionCode);
disposition = EXCEPTION_CONTINUE_SEARCH;
break;
}