From 38f74125d143750617252b8cb5411c95e52a2a35 Mon Sep 17 00:00:00 2001 From: David Holmes Date: Thu, 13 Jul 2023 01:21:06 +0000 Subject: [PATCH] 8311609: [windows] Native stack printing lacks source information for dynamically loaded dlls Reviewed-by: stuefe, iklam --- src/hotspot/os/windows/symbolengine.cpp | 5 +++++ src/hotspot/os/windows/symbolengine.hpp | 5 +++++ src/hotspot/os/windows/windbghelp.cpp | 13 +++++++++++-- src/hotspot/os/windows/windbghelp.hpp | 3 ++- src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp | 5 +++++ 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/hotspot/os/windows/symbolengine.cpp b/src/hotspot/os/windows/symbolengine.cpp index f178c3648b4..2205add6653 100644 --- a/src/hotspot/os/windows/symbolengine.cpp +++ b/src/hotspot/os/windows/symbolengine.cpp @@ -576,6 +576,11 @@ bool SymbolEngine::recalc_search_path(bool* p_search_path_was_updated) { } +bool SymbolEngine::refreshModuleList() { + SymbolEngineEntry entry_guard; + return WindowsDbgHelp::symRefreshModuleList(::GetCurrentProcess()); +} + bool SymbolEngine::get_source_info(const void* addr, char* buf, size_t buflen, int* line_no) { diff --git a/src/hotspot/os/windows/symbolengine.hpp b/src/hotspot/os/windows/symbolengine.hpp index af22131d04a..02d3ba9487d 100644 --- a/src/hotspot/os/windows/symbolengine.hpp +++ b/src/hotspot/os/windows/symbolengine.hpp @@ -49,6 +49,11 @@ namespace SymbolEngine { // Returns true for success, false for error. bool recalc_search_path(bool* p_search_path_was_updated = nullptr); + // Refresh the list of loaded modules e.g. pick up any newly loaded dll's + // since VM initialization. + // Returns true for success, false for error. + bool refreshModuleList(); + // Print one liner describing state (if library loaded, which functions are // missing - if any, and the dbhelp API version) void print_state_on(outputStream* st); diff --git a/src/hotspot/os/windows/windbghelp.cpp b/src/hotspot/os/windows/windbghelp.cpp index db4538ccf0f..92c88d08cfc 100644 --- a/src/hotspot/os/windows/windbghelp.cpp +++ b/src/hotspot/os/windows/windbghelp.cpp @@ -35,6 +35,7 @@ typedef BOOL (WINAPI *pfn_SymGetSymFromAddr64)(HANDLE, DWORD64, PDWORD64, PIMAG typedef DWORD (WINAPI *pfn_UnDecorateSymbolName)(const char*, char*, DWORD, DWORD); typedef BOOL (WINAPI *pfn_SymSetSearchPath)(HANDLE, PCTSTR); typedef BOOL (WINAPI *pfn_SymGetSearchPath)(HANDLE, PTSTR, int); +typedef BOOL (WINAPI *pfn_SymRefreshModuleList)(HANDLE); typedef BOOL (WINAPI *pfn_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread, @@ -68,7 +69,8 @@ typedef LPAPI_VERSION (WINAPI *pfn_ImagehlpApiVersion)(void); DO(SymFunctionTableAccess64) \ DO(SymGetModuleBase64) \ DO(MiniDumpWriteDump) \ - DO(SymGetLineFromAddr64) + DO(SymGetLineFromAddr64) \ + DO(SymRefreshModuleList) #define DECLARE_FUNCTION_POINTER(functionname) \ @@ -205,6 +207,14 @@ BOOL WindowsDbgHelp::symGetSearchPath(HANDLE hProcess, PTSTR SearchPath, int Sea return FALSE; } +BOOL WindowsDbgHelp::symRefreshModuleList(HANDLE hProcess) { + WindowsDbgHelpEntry entry_guard; + if (g_pfn_SymRefreshModuleList != nullptr) { + return g_pfn_SymRefreshModuleList(hProcess); + } + return FALSE; +} + BOOL WindowsDbgHelp::stackWalk64(DWORD MachineType, HANDLE hProcess, HANDLE hThread, @@ -301,4 +311,3 @@ void WindowsDbgHelp::print_state_on(outputStream* st) { } st->cr(); } - diff --git a/src/hotspot/os/windows/windbghelp.hpp b/src/hotspot/os/windows/windbghelp.hpp index 3a329c5654e..e3e3826db29 100644 --- a/src/hotspot/os/windows/windbghelp.hpp +++ b/src/hotspot/os/windows/windbghelp.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2023, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,6 +61,7 @@ namespace WindowsDbgHelp { PMINIDUMP_CALLBACK_INFORMATION CallbackParam); BOOL symGetLineFromAddr64 (HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINE64 Line); + BOOL symRefreshModuleList(HANDLE hProcess); // Print one liner describing state (if library loaded, which functions are // missing - if any, and the dbhelp API version) diff --git a/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp b/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp index 73b8a46126d..d92e089f02b 100644 --- a/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp +++ b/src/hotspot/os_cpu/windows_x86/os_windows_x86.cpp @@ -244,6 +244,9 @@ bool os::win32::platform_print_native_stack(outputStream* st, const void* contex stk.AddrPC.Offset = ctx.Rip; stk.AddrPC.Mode = AddrModeFlat; + // Ensure we consider dynamically loaded dll's + SymbolEngine::refreshModuleList(); + int count = 0; address lastpc_internal = 0; while (count++ < StackPrintLimit) { @@ -265,6 +268,8 @@ bool os::win32::platform_print_native_stack(outputStream* st, const void* contex int line_no; if (SymbolEngine::get_source_info(pc, buf, sizeof(buf), &line_no)) { st->print(" (%s:%d)", buf, line_no); + } else { + st->print(" (no source info available)"); } st->cr(); }