summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_symbolizer_win.cc
diff options
context:
space:
mode:
authorTimur Iskhodzhanov <timurrrr@google.com>2014-07-16 14:11:02 +0000
committerTimur Iskhodzhanov <timurrrr@google.com>2014-07-16 14:11:02 +0000
commitc125262f6e89ce9d9145efb6fd0425ebd234975e (patch)
treec7aa8b7add0006bc25b1898716ad2a45f2b916de /lib/sanitizer_common/sanitizer_symbolizer_win.cc
parentb84dd55cab068d8287764588f0e74a159c7c87b2 (diff)
downloadcompiler-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.cc22
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_;