From f1975a09ffe5327083bb58695abc224a6dd28f68 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 8 Jul 2020 11:38:39 +0200 Subject: [PATCH 1/5] include line numbers in win abort handler --- test/core/util/test_config.cc | 74 ++++++++++++----------------------- 1 file changed, 26 insertions(+), 48 deletions(-) diff --git a/test/core/util/test_config.cc b/test/core/util/test_config.cc index c6ee9fc2400..e332d9bc3ea 100644 --- a/test/core/util/test_config.cc +++ b/test/core/util/test_config.cc @@ -61,45 +61,7 @@ static unsigned seed(void) { return (unsigned)_getpid(); } #pragma comment(lib, "dbghelp.lib") #endif -static void print_current_stack() { - typedef USHORT(WINAPI * CaptureStackBackTraceType)( - __in ULONG, __in ULONG, __out PVOID*, __out_opt PULONG); - CaptureStackBackTraceType func = (CaptureStackBackTraceType)(GetProcAddress( - LoadLibrary(_T("kernel32.dll")), "RtlCaptureStackBackTrace")); - - if (func == NULL) return; // WOE 29.SEP.2010 - -// Quote from Microsoft Documentation: -// ## Windows Server 2003 and Windows XP: -// ## The sum of the FramesToSkip and FramesToCapture parameters must be less -// than 63. -#define MAX_CALLERS 62 - - void* callers_stack[MAX_CALLERS]; - unsigned short frames; - SYMBOL_INFOW* symbol; - HANDLE process; - process = GetCurrentProcess(); - SymInitialize(process, NULL, TRUE); - frames = (func)(0, MAX_CALLERS, callers_stack, NULL); - symbol = - (SYMBOL_INFOW*)calloc(sizeof(SYMBOL_INFOW) + 256 * sizeof(wchar_t), 1); - symbol->MaxNameLen = 255; - symbol->SizeOfStruct = sizeof(SYMBOL_INFOW); - - const unsigned short MAX_CALLERS_SHOWN = 32; - frames = frames < MAX_CALLERS_SHOWN ? frames : MAX_CALLERS_SHOWN; - for (unsigned int i = 0; i < frames; i++) { - SymFromAddrW(process, (DWORD64)(callers_stack[i]), 0, symbol); - fwprintf(stderr, L"*** %d: %016I64X %ls - %016I64X\n", i, - (DWORD64)callers_stack[i], symbol->Name, (DWORD64)symbol->Address); - fflush(stderr); - } - - free(symbol); -} - -static void print_stack_from_context(CONTEXT c) { +static void print_stack_from_context(HANDLE thread, CONTEXT c) { STACKFRAME s; // in/out stackframe memset(&s, 0, sizeof(s)); DWORD imageType; @@ -135,26 +97,42 @@ static void print_stack_from_context(CONTEXT c) { #endif HANDLE process = GetCurrentProcess(); - HANDLE thread = GetCurrentThread(); SYMBOL_INFOW* symbol = (SYMBOL_INFOW*)calloc(sizeof(SYMBOL_INFOW) + 256 * sizeof(wchar_t), 1); symbol->MaxNameLen = 255; symbol->SizeOfStruct = sizeof(SYMBOL_INFOW); - while (StackWalk(imageType, process, thread, &s, &c, 0, - SymFunctionTableAccess, SymGetModuleBase, 0)) { - BOOL has_symbol = - SymFromAddrW(process, (DWORD64)(s.AddrPC.Offset), 0, symbol); - fwprintf( - stderr, L"*** %016I64X %ls - %016I64X\n", (DWORD64)(s.AddrPC.Offset), - has_symbol ? symbol->Name : L"<>", (DWORD64)symbol->Address); + const unsigned short MAX_CALLERS_SHOWN = 32; + for (int frame = 0; frame < MAX_CALLERS_SHOWN && StackWalk(imageType, process, thread, &s, &c, 0, + SymFunctionTableAccess, SymGetModuleBase, 0); frame++) { + SymFromAddrW(process, (DWORD64)(s.AddrPC.Offset), 0, symbol); + + PWSTR file_name = L"<>"; + int line_number = 0; + IMAGEHLP_LINE line; + line.SizeOfStruct = sizeof(IMAGEHLP_LINE); + DWORD displacement = 0; + if (SymGetLineFromAddrW(process, (DWORD64)(s.AddrPC.Offset), &displacement, &line)) + { + file_name = line.FileName; + line_number = (int)line.LineNumber; + } + + fwprintf(stderr, L"*** %d: %016I64X %ls - %016I64X (%ls:%d)\n", frame, + (DWORD64)(s.AddrPC.Offset), symbol->Name, (DWORD64)symbol->Address, file_name, line_number); fflush(stderr); } free(symbol); } +static void print_current_stack() { + CONTEXT context; + RtlCaptureContext(&context); + print_stack_from_context(GetCurrentThread(), context); +} + static LONG crash_handler(struct _EXCEPTION_POINTERS* ex_info) { fprintf(stderr, "Exception handler called, dumping information\n"); bool try_to_print_stack = true; @@ -168,7 +146,7 @@ static LONG crash_handler(struct _EXCEPTION_POINTERS* ex_info) { exrec = exrec->ExceptionRecord; } if (try_to_print_stack) { - print_stack_from_context(*ex_info->ContextRecord); + print_stack_from_context(GetCurrentThread(), *ex_info->ContextRecord); } if (IsDebuggerPresent()) { __debugbreak(); From 8cbd5550efcbd00bc26868a978c9e42e9ab4bbb6 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 13 Jul 2020 16:56:52 +0200 Subject: [PATCH 2/5] address comments --- test/core/util/test_config.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/test/core/util/test_config.cc b/test/core/util/test_config.cc index e332d9bc3ea..4a8a976b54e 100644 --- a/test/core/util/test_config.cc +++ b/test/core/util/test_config.cc @@ -103,24 +103,28 @@ static void print_stack_from_context(HANDLE thread, CONTEXT c) { symbol->MaxNameLen = 255; symbol->SizeOfStruct = sizeof(SYMBOL_INFOW); - const unsigned short MAX_CALLERS_SHOWN = 32; + const unsigned short MAX_CALLERS_SHOWN = 8192; // avoid flooding the stderr if stacktrace is way too long for (int frame = 0; frame < MAX_CALLERS_SHOWN && StackWalk(imageType, process, thread, &s, &c, 0, SymFunctionTableAccess, SymGetModuleBase, 0); frame++) { - SymFromAddrW(process, (DWORD64)(s.AddrPC.Offset), 0, symbol); + PWSTR symbol_name = L"<>"; + DWORD64 symbol_address = 0; + if (SymFromAddrW(process, (DWORD64)(s.AddrPC.Offset), 0, symbol)) { + symbol_name = symbol->Name; + symbol_address = (DWORD64)symbol->Address; + } PWSTR file_name = L"<>"; int line_number = 0; IMAGEHLP_LINE line; line.SizeOfStruct = sizeof(IMAGEHLP_LINE); DWORD displacement = 0; - if (SymGetLineFromAddrW(process, (DWORD64)(s.AddrPC.Offset), &displacement, &line)) - { + if (SymGetLineFromAddrW(process, (DWORD64)(s.AddrPC.Offset), &displacement, &line)) { file_name = line.FileName; line_number = (int)line.LineNumber; } fwprintf(stderr, L"*** %d: %016I64X %ls - %016I64X (%ls:%d)\n", frame, - (DWORD64)(s.AddrPC.Offset), symbol->Name, (DWORD64)symbol->Address, file_name, line_number); + (DWORD64)(s.AddrPC.Offset), symbol_name, symbol_address, file_name, line_number); fflush(stderr); } From bc9e99e6352a1d8635e445352d04d38644d9bdd6 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 13 Jul 2020 16:58:57 +0200 Subject: [PATCH 3/5] clang format code --- test/core/util/test_config.cc | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/test/core/util/test_config.cc b/test/core/util/test_config.cc index 4a8a976b54e..1606a16a13c 100644 --- a/test/core/util/test_config.cc +++ b/test/core/util/test_config.cc @@ -103,9 +103,12 @@ static void print_stack_from_context(HANDLE thread, CONTEXT c) { symbol->MaxNameLen = 255; symbol->SizeOfStruct = sizeof(SYMBOL_INFOW); - const unsigned short MAX_CALLERS_SHOWN = 8192; // avoid flooding the stderr if stacktrace is way too long - for (int frame = 0; frame < MAX_CALLERS_SHOWN && StackWalk(imageType, process, thread, &s, &c, 0, - SymFunctionTableAccess, SymGetModuleBase, 0); frame++) { + const unsigned short MAX_CALLERS_SHOWN = + 8192; // avoid flooding the stderr if stacktrace is way too long + for (int frame = 0; frame < MAX_CALLERS_SHOWN && + StackWalk(imageType, process, thread, &s, &c, 0, + SymFunctionTableAccess, SymGetModuleBase, 0); + frame++) { PWSTR symbol_name = L"<>"; DWORD64 symbol_address = 0; if (SymFromAddrW(process, (DWORD64)(s.AddrPC.Offset), 0, symbol)) { @@ -118,13 +121,15 @@ static void print_stack_from_context(HANDLE thread, CONTEXT c) { IMAGEHLP_LINE line; line.SizeOfStruct = sizeof(IMAGEHLP_LINE); DWORD displacement = 0; - if (SymGetLineFromAddrW(process, (DWORD64)(s.AddrPC.Offset), &displacement, &line)) { - file_name = line.FileName; - line_number = (int)line.LineNumber; + if (SymGetLineFromAddrW(process, (DWORD64)(s.AddrPC.Offset), &displacement, + &line)) { + file_name = line.FileName; + line_number = (int)line.LineNumber; } fwprintf(stderr, L"*** %d: %016I64X %ls - %016I64X (%ls:%d)\n", frame, - (DWORD64)(s.AddrPC.Offset), symbol_name, symbol_address, file_name, line_number); + (DWORD64)(s.AddrPC.Offset), symbol_name, symbol_address, file_name, + line_number); fflush(stderr); } From 7d7435d1c4dd78c6c4de30935d078b8210328169 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 14 Aug 2020 16:29:09 +0200 Subject: [PATCH 4/5] make win stacktrace buildable on both cmake x86 and bazel 64bit --- test/core/util/test_config.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/core/util/test_config.cc b/test/core/util/test_config.cc index 1606a16a13c..07b2b7aa3d7 100644 --- a/test/core/util/test_config.cc +++ b/test/core/util/test_config.cc @@ -118,10 +118,10 @@ static void print_stack_from_context(HANDLE thread, CONTEXT c) { PWSTR file_name = L"<>"; int line_number = 0; - IMAGEHLP_LINE line; - line.SizeOfStruct = sizeof(IMAGEHLP_LINE); + IMAGEHLP_LINE64 line; + line.SizeOfStruct = sizeof(IMAGEHLP_LINE64); DWORD displacement = 0; - if (SymGetLineFromAddrW(process, (DWORD64)(s.AddrPC.Offset), &displacement, + if (SymGetLineFromAddrW64(process, (DWORD64)(s.AddrPC.Offset), &displacement, &line)) { file_name = line.FileName; line_number = (int)line.LineNumber; From ed97c209f10273eb4baad9d474e70a846f2c98e7 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 14 Aug 2020 17:02:40 +0200 Subject: [PATCH 5/5] clang format code --- test/core/util/test_config.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/core/util/test_config.cc b/test/core/util/test_config.cc index 07b2b7aa3d7..acbbc12d6d0 100644 --- a/test/core/util/test_config.cc +++ b/test/core/util/test_config.cc @@ -121,8 +121,8 @@ static void print_stack_from_context(HANDLE thread, CONTEXT c) { IMAGEHLP_LINE64 line; line.SizeOfStruct = sizeof(IMAGEHLP_LINE64); DWORD displacement = 0; - if (SymGetLineFromAddrW64(process, (DWORD64)(s.AddrPC.Offset), &displacement, - &line)) { + if (SymGetLineFromAddrW64(process, (DWORD64)(s.AddrPC.Offset), + &displacement, &line)) { file_name = line.FileName; line_number = (int)line.LineNumber; }