[PATCH] D119181: [Support] Don't print stacktrace if DbgHelp.dll hasn't been loaded yet
Andy Yankovsky via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 7 12:38:09 PST 2022
werat created this revision.
werat added reviewers: aganea, JDevlieghere, labath.
Herald added subscribers: dexonsmith, hiraditya.
werat requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
On Windows certain function from `Signals.h` require that `DbgHelp.dll` is loaded. This typically happens when the main program calls `llvm::InitLLVM`, however in some cases main program doesn't do that (e.g. when the application is using LLDB via `liblldb.dll`). This patch adds a safe guard to prevent crashes. More discussion in
https://reviews.llvm.org/D119009.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D119181
Files:
llvm/lib/Support/Windows/Signals.inc
Index: llvm/lib/Support/Windows/Signals.inc
===================================================================
--- llvm/lib/Support/Windows/Signals.inc
+++ llvm/lib/Support/Windows/Signals.inc
@@ -159,6 +159,10 @@
typedef BOOL (WINAPI *fpEnumerateLoadedModules)(HANDLE,PENUMLOADED_MODULES_CALLBACK64,PVOID);
static fpEnumerateLoadedModules fEnumerateLoadedModules;
+static bool isDebugHelpInitialized() {
+ return fStackWalk64 && fSymInitialize && fSymSetOptions && fMiniDumpWriteDump;
+}
+
static bool load64BitDebugHelp(void) {
HMODULE hLib = ::LoadLibraryW(L"Dbghelp.dll");
if (hLib) {
@@ -181,7 +185,7 @@
fEnumerateLoadedModules = (fpEnumerateLoadedModules)
::GetProcAddress(hLib, "EnumerateLoadedModules64");
}
- return fStackWalk64 && fSymInitialize && fSymSetOptions && fMiniDumpWriteDump;
+ return isDebugHelpInitialized();
}
using namespace llvm;
@@ -296,6 +300,12 @@
static void PrintStackTraceForThread(llvm::raw_ostream &OS, HANDLE hProcess,
HANDLE hThread, STACKFRAME64 &StackFrame,
CONTEXT *Context) {
+ // It's possible that DbgHelp.dll hasn't been loaded yet (e.g. if this
+ // function is called before the main program called `llvm::InitLLVM`).
+ // In this case just return, not stacktrace will be printed.
+ if (!isDebugHelpInitialized())
+ return;
+
// Initialize the symbol handler.
fSymSetOptions(SYMOPT_DEFERRED_LOADS | SYMOPT_LOAD_LINES);
fSymInitialize(hProcess, NULL, TRUE);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D119181.406576.patch
Type: text/x-patch
Size: 1529 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220207/c8af5c96/attachment.bin>
More information about the llvm-commits
mailing list