diff options
-rw-r--r-- | .gitattributes | 1 | ||||
-rw-r--r-- | build/win32/project/Makefile_agent | 7 | ||||
-rw-r--r-- | build/win32/project/Makefile_agent.inc | 10 | ||||
-rw-r--r-- | build/win32/project/Makefile_agent_x64 | 5 | ||||
-rw-r--r-- | build/win32/project/Makefile_get.inc | 6 | ||||
-rw-r--r-- | build/win32/project/Makefile_sender.inc | 7 | ||||
-rw-r--r-- | include/threads.h | 3 | ||||
-rw-r--r-- | src/libs/zbxsys/threads.c | 21 | ||||
-rw-r--r-- | src/libs/zbxwin32/fatal.c | 240 | ||||
-rw-r--r-- | src/zabbix_agent/active.c | 2 |
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; } |