diff options
author | Timur Iskhodzhanov <timurrrr@google.com> | 2014-07-16 14:11:02 +0000 |
---|---|---|
committer | Timur Iskhodzhanov <timurrrr@google.com> | 2014-07-16 14:11:02 +0000 |
commit | c125262f6e89ce9d9145efb6fd0425ebd234975e (patch) | |
tree | c7aa8b7add0006bc25b1898716ad2a45f2b916de /lib/sanitizer_common/sanitizer_symbolizer_win.cc | |
parent | b84dd55cab068d8287764588f0e74a159c7c87b2 (diff) | |
download | compiler-rt-c125262f6e89ce9d9145efb6fd0425ebd234975e.tar.gz |
[ASan/Win] Handle situations when the client app has used DbgHelp before
Reviewed at http://reviews.llvm.org/D4533
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@213151 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_symbolizer_win.cc')
-rw-r--r-- | lib/sanitizer_common/sanitizer_symbolizer_win.cc | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/lib/sanitizer_common/sanitizer_symbolizer_win.cc b/lib/sanitizer_common/sanitizer_symbolizer_win.cc index dc4816b66..a7acdb69b 100644 --- a/lib/sanitizer_common/sanitizer_symbolizer_win.cc +++ b/lib/sanitizer_common/sanitizer_symbolizer_win.cc @@ -32,11 +32,17 @@ class WinSymbolizer : public Symbolizer { BlockingMutexLock l(&dbghelp_mu_); if (!initialized_) { - SymSetOptions(SYMOPT_DEFERRED_LOADS | - SYMOPT_UNDNAME | - SYMOPT_LOAD_LINES); - CHECK(SymInitialize(GetCurrentProcess(), 0, TRUE)); - // FIXME: We don't call SymCleanup() on exit yet - should we? + if (!TrySymInitialize()) { + // OK, maybe the client app has called SymInitialize already. + // That's a bit unfortunate for us as all the DbgHelp functions are + // single-threaded and we can't coordinate with the app. + // FIXME: Can we stop the other threads at this point? + // Anyways, we have to reconfigure stuff to make sure that SymInitialize + // has all the appropriate options set. + // Cross our fingers and reinitialize DbgHelp. + CHECK(SymCleanup(GetCurrentProcess())); + CHECK(TrySymInitialize()); + } initialized_ = true; } @@ -92,6 +98,12 @@ class WinSymbolizer : public Symbolizer { // FIXME: Implement GetModuleNameAndOffsetForPC(). private: + bool TrySymInitialize() { + SymSetOptions(SYMOPT_DEFERRED_LOADS | SYMOPT_UNDNAME | SYMOPT_LOAD_LINES); + return SymInitialize(GetCurrentProcess(), 0, TRUE); + // FIXME: We don't call SymCleanup() on exit yet - should we? + } + // All DbgHelp functions are single threaded, so we should use a mutex to // serialize accesses. BlockingMutex dbghelp_mu_; |