| Index: runtime/vm/native_symbol_win.cc
|
| diff --git a/runtime/vm/native_symbol_win.cc b/runtime/vm/native_symbol_win.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6df05effde613912a80cf09309ae97301de36b98
|
| --- /dev/null
|
| +++ b/runtime/vm/native_symbol_win.cc
|
| @@ -0,0 +1,76 @@
|
| +// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +#include "vm/globals.h"
|
| +#if defined(TARGET_OS_WINDOWS)
|
| +
|
| +#include "vm/native_symbol.h"
|
| +#include "vm/thread.h"
|
| +
|
| +#include <dbghelp.h> // NOLINT
|
| +
|
| +namespace dart {
|
| +
|
| +static bool running_ = false;
|
| +static Mutex* lock_ = NULL;
|
| +
|
| +void NativeSymbolResolver::InitOnce() {
|
| + ASSERT(running_ == false);
|
| + SymSetOptions(SYMOPT_UNDNAME | SYMOPT_DEFERRED_LOADS);
|
| + HANDLE hProcess = GetCurrentProcess();
|
| + if (!SymInitialize(hProcess, NULL, TRUE)) {
|
| + DWORD error = GetLastError();
|
| + printf("Failed to init NativeSymbolResolver (SymInitialize %d)\n", error);
|
| + return;
|
| + }
|
| + lock_ = new Mutex();
|
| + running_ = true;
|
| +}
|
| +
|
| +
|
| +void NativeSymbolResolver::ShutdownOnce() {
|
| + ScopedMutex lock(lock_);
|
| + if (!running_) {
|
| + return;
|
| + }
|
| + running_ = false;
|
| + HANDLE hProcess = GetCurrentProcess();
|
| + if (!SymCleanup(hProcess)) {
|
| + DWORD error = GetLastError();
|
| + printf("Failed to shutdown NativeSymbolResolver (SymCleanup %d)\n", error);
|
| + }
|
| +}
|
| +
|
| +
|
| +char* NativeSymbolResolver::LookupSymbolName(uintptr_t pc) {
|
| + static const intptr_t kMaxNameLength = 2048;
|
| + static const intptr_t kSymbolInfoSize = sizeof(SYMBOL_INFO); // NOLINT.
|
| + static char buffer[kSymbolInfoSize + kMaxNameLength];
|
| + static char name_buffer[kMaxNameLength];
|
| + ScopedMutex lock(lock_);
|
| + if (!running_) {
|
| + return NULL;
|
| + }
|
| + memset(&buffer[0], 0, sizeof(buffer));
|
| + HANDLE hProcess = GetCurrentProcess();
|
| + DWORD64 address = static_cast<DWORD64>(pc);
|
| + PSYMBOL_INFO pSymbol = reinterpret_cast<PSYMBOL_INFO>(&buffer[0]);
|
| + pSymbol->SizeOfStruct = kSymbolInfoSize;
|
| + pSymbol->MaxNameLen = kMaxNameLength;
|
| + BOOL r = SymFromAddr(hProcess, address, NULL, pSymbol);
|
| + if (r == FALSE) {
|
| + return NULL;
|
| + }
|
| + return strdup(pSymbol->Name);
|
| +}
|
| +
|
| +
|
| +void NativeSymbolResolver::FreeSymbolName(char* name) {
|
| + free(name);
|
| +}
|
| +
|
| +
|
| +} // namespace dart
|
| +
|
| +#endif // defined(TARGET_OS_WINDOWS)
|
|
|