Index: src/platform-win32.cc |
diff --git a/src/platform-win32.cc b/src/platform-win32.cc |
index 52888fe2d472c44834b94028da169c9b6298b6de..b30aa24878d72fc6262aef7f81f7b43ddd827b63 100644 |
--- a/src/platform-win32.cc |
+++ b/src/platform-win32.cc |
@@ -1058,10 +1058,13 @@ TLHELP32_FUNCTION_LIST(DLL_FUNC_LOADED) |
// Load the symbols for generating stack traces. |
-static bool LoadSymbols(Isolate* isolate, HANDLE process_handle) { |
+static std::vector<OS::SharedLibraryAddress> LoadSymbols( |
+ HANDLE process_handle) { |
+ static std::vector<OS::SharedLibraryAddress> result; |
+ |
static bool symbols_loaded = false; |
- if (symbols_loaded) return true; |
+ if (symbols_loaded) return result; |
BOOL ok; |
@@ -1069,7 +1072,7 @@ static bool LoadSymbols(Isolate* isolate, HANDLE process_handle) { |
ok = _SymInitialize(process_handle, // hProcess |
NULL, // UserSearchPath |
false); // fInvadeProcess |
- if (!ok) return false; |
+ if (!ok) return result; |
DWORD options = _SymGetOptions(); |
options |= SYMOPT_LOAD_LINES; |
@@ -1081,13 +1084,13 @@ static bool LoadSymbols(Isolate* isolate, HANDLE process_handle) { |
if (!ok) { |
int err = GetLastError(); |
PrintF("%d\n", err); |
- return false; |
+ return result; |
} |
HANDLE snapshot = _CreateToolhelp32Snapshot( |
TH32CS_SNAPMODULE, // dwFlags |
GetCurrentProcessId()); // th32ProcessId |
- if (snapshot == INVALID_HANDLE_VALUE) return false; |
+ if (snapshot == INVALID_HANDLE_VALUE) return result; |
MODULEENTRY32W module_entry; |
module_entry.dwSize = sizeof(module_entry); // Set the size of the structure. |
BOOL cont = _Module32FirstW(snapshot, &module_entry); |
@@ -1105,31 +1108,37 @@ static bool LoadSymbols(Isolate* isolate, HANDLE process_handle) { |
if (base == 0) { |
int err = GetLastError(); |
if (err != ERROR_MOD_NOT_FOUND && |
- err != ERROR_INVALID_HANDLE) return false; |
+ err != ERROR_INVALID_HANDLE) { |
+ result.clear(); |
+ return result; |
+ } |
} |
- LOG(isolate, |
- SharedLibraryEvent( |
- module_entry.szExePath, |
- reinterpret_cast<unsigned int>(module_entry.modBaseAddr), |
- reinterpret_cast<unsigned int>(module_entry.modBaseAddr + |
- module_entry.modBaseSize))); |
+ int lib_name_length = WideCharToMultiByte( |
+ CP_UTF8, 0, module_entry.szExePath, -1, NULL, 0, NULL, NULL); |
+ std::string lib_name(lib_name_length, 0); |
+ WideCharToMultiByte(CP_UTF8, 0, module_entry.szExePath, -1, &lib_name[0], |
+ lib_name_length, NULL, NULL); |
+ result.push_back(OS::SharedLibraryAddress( |
+ lib_name, reinterpret_cast<unsigned int>(module_entry.modBaseAddr), |
+ reinterpret_cast<unsigned int>(module_entry.modBaseAddr + |
+ module_entry.modBaseSize))); |
cont = _Module32NextW(snapshot, &module_entry); |
} |
CloseHandle(snapshot); |
symbols_loaded = true; |
- return true; |
+ return result; |
} |
-void OS::LogSharedLibraryAddresses(Isolate* isolate) { |
+std::vector<OS::SharedLibraryAddress> OS::GetSharedLibraryAddresses() { |
// SharedLibraryEvents are logged when loading symbol information. |
// Only the shared libraries loaded at the time of the call to |
- // LogSharedLibraryAddresses are logged. DLLs loaded after |
+ // GetSharedLibraryAddresses are logged. DLLs loaded after |
// initialization are not accounted for. |
- if (!LoadDbgHelpAndTlHelp32()) return; |
+ if (!LoadDbgHelpAndTlHelp32()) return std::vector<OS::SharedLibraryAddress>(); |
HANDLE process_handle = GetCurrentProcess(); |
- LoadSymbols(isolate, process_handle); |
+ return LoadSymbols(process_handle); |
} |
@@ -1150,7 +1159,11 @@ uint64_t OS::TotalPhysicalMemory() { |
#else // __MINGW32__ |
-void OS::LogSharedLibraryAddresses(Isolate* isolate) { } |
+std::vector<OS::SharedLibraryAddress> OS::GetSharedLibraryAddresses() { |
+ return std::vector<OS::SharedLibraryAddress>(); |
+} |
+ |
+ |
void OS::SignalCodeMovingGC() { } |
#endif // __MINGW32__ |