| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 991 // application is closed. | 991 // application is closed. |
| 992 } | 992 } |
| 993 | 993 |
| 994 #undef DBGHELP_FUNCTION_LIST | 994 #undef DBGHELP_FUNCTION_LIST |
| 995 #undef TLHELP32_FUNCTION_LIST | 995 #undef TLHELP32_FUNCTION_LIST |
| 996 #undef DLL_FUNC_VAR | 996 #undef DLL_FUNC_VAR |
| 997 #undef DLL_FUNC_TYPE | 997 #undef DLL_FUNC_TYPE |
| 998 | 998 |
| 999 | 999 |
| 1000 // Load the symbols for generating stack traces. | 1000 // Load the symbols for generating stack traces. |
| 1001 static bool LoadSymbols(HANDLE process_handle) { | 1001 static bool LoadSymbols(Isolate* isolate, HANDLE process_handle) { |
| 1002 static bool symbols_loaded = false; | 1002 static bool symbols_loaded = false; |
| 1003 | 1003 |
| 1004 if (symbols_loaded) return true; | 1004 if (symbols_loaded) return true; |
| 1005 | 1005 |
| 1006 BOOL ok; | 1006 BOOL ok; |
| 1007 | 1007 |
| 1008 // Initialize the symbol engine. | 1008 // Initialize the symbol engine. |
| 1009 ok = _SymInitialize(process_handle, // hProcess | 1009 ok = _SymInitialize(process_handle, // hProcess |
| 1010 NULL, // UserSearchPath | 1010 NULL, // UserSearchPath |
| 1011 false); // fInvadeProcess | 1011 false); // fInvadeProcess |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1040 0, // hFile | 1040 0, // hFile |
| 1041 reinterpret_cast<PSTR>(module_entry.szExePath), // ImageName | 1041 reinterpret_cast<PSTR>(module_entry.szExePath), // ImageName |
| 1042 reinterpret_cast<PSTR>(module_entry.szModule), // ModuleName | 1042 reinterpret_cast<PSTR>(module_entry.szModule), // ModuleName |
| 1043 reinterpret_cast<DWORD64>(module_entry.modBaseAddr), // BaseOfDll | 1043 reinterpret_cast<DWORD64>(module_entry.modBaseAddr), // BaseOfDll |
| 1044 module_entry.modBaseSize); // SizeOfDll | 1044 module_entry.modBaseSize); // SizeOfDll |
| 1045 if (base == 0) { | 1045 if (base == 0) { |
| 1046 int err = GetLastError(); | 1046 int err = GetLastError(); |
| 1047 if (err != ERROR_MOD_NOT_FOUND && | 1047 if (err != ERROR_MOD_NOT_FOUND && |
| 1048 err != ERROR_INVALID_HANDLE) return false; | 1048 err != ERROR_INVALID_HANDLE) return false; |
| 1049 } | 1049 } |
| 1050 LOG(i::Isolate::Current(), | 1050 LOG(isolate, |
| 1051 SharedLibraryEvent( | 1051 SharedLibraryEvent( |
| 1052 module_entry.szExePath, | 1052 module_entry.szExePath, |
| 1053 reinterpret_cast<unsigned int>(module_entry.modBaseAddr), | 1053 reinterpret_cast<unsigned int>(module_entry.modBaseAddr), |
| 1054 reinterpret_cast<unsigned int>(module_entry.modBaseAddr + | 1054 reinterpret_cast<unsigned int>(module_entry.modBaseAddr + |
| 1055 module_entry.modBaseSize))); | 1055 module_entry.modBaseSize))); |
| 1056 cont = _Module32NextW(snapshot, &module_entry); | 1056 cont = _Module32NextW(snapshot, &module_entry); |
| 1057 } | 1057 } |
| 1058 CloseHandle(snapshot); | 1058 CloseHandle(snapshot); |
| 1059 | 1059 |
| 1060 symbols_loaded = true; | 1060 symbols_loaded = true; |
| 1061 return true; | 1061 return true; |
| 1062 } | 1062 } |
| 1063 | 1063 |
| 1064 | 1064 |
| 1065 void OS::LogSharedLibraryAddresses() { | 1065 void OS::LogSharedLibraryAddresses(Isolate* isolate) { |
| 1066 // SharedLibraryEvents are logged when loading symbol information. | 1066 // SharedLibraryEvents are logged when loading symbol information. |
| 1067 // Only the shared libraries loaded at the time of the call to | 1067 // Only the shared libraries loaded at the time of the call to |
| 1068 // LogSharedLibraryAddresses are logged. DLLs loaded after | 1068 // LogSharedLibraryAddresses are logged. DLLs loaded after |
| 1069 // initialization are not accounted for. | 1069 // initialization are not accounted for. |
| 1070 if (!LoadDbgHelpAndTlHelp32()) return; | 1070 if (!LoadDbgHelpAndTlHelp32()) return; |
| 1071 HANDLE process_handle = GetCurrentProcess(); | 1071 HANDLE process_handle = GetCurrentProcess(); |
| 1072 LoadSymbols(process_handle); | 1072 LoadSymbols(isolate, process_handle); |
| 1073 } | 1073 } |
| 1074 | 1074 |
| 1075 | 1075 |
| 1076 void OS::SignalCodeMovingGC() { | 1076 void OS::SignalCodeMovingGC() { |
| 1077 } | 1077 } |
| 1078 | 1078 |
| 1079 | 1079 |
| 1080 // Walk the stack using the facilities in dbghelp.dll and tlhelp32.dll | 1080 // Walk the stack using the facilities in dbghelp.dll and tlhelp32.dll |
| 1081 | 1081 |
| 1082 // Switch off warning 4748 (/GS can not protect parameters and local variables | 1082 // Switch off warning 4748 (/GS can not protect parameters and local variables |
| 1083 // from local buffer overrun because optimizations are disabled in function) as | 1083 // from local buffer overrun because optimizations are disabled in function) as |
| 1084 // it is triggered by the use of inline assembler. | 1084 // it is triggered by the use of inline assembler. |
| 1085 #pragma warning(push) | 1085 #pragma warning(push) |
| 1086 #pragma warning(disable : 4748) | 1086 #pragma warning(disable : 4748) |
| 1087 int OS::StackWalk(Vector<OS::StackFrame> frames) { | 1087 int OS::StackWalk(Vector<OS::StackFrame> frames) { |
| 1088 BOOL ok; | 1088 BOOL ok; |
| 1089 | 1089 |
| 1090 // Load the required functions from DLL's. | 1090 // Load the required functions from DLL's. |
| 1091 if (!LoadDbgHelpAndTlHelp32()) return kStackWalkError; | 1091 if (!LoadDbgHelpAndTlHelp32()) return kStackWalkError; |
| 1092 | 1092 |
| 1093 // Get the process and thread handles. | 1093 // Get the process and thread handles. |
| 1094 HANDLE process_handle = GetCurrentProcess(); | 1094 HANDLE process_handle = GetCurrentProcess(); |
| 1095 HANDLE thread_handle = GetCurrentThread(); | 1095 HANDLE thread_handle = GetCurrentThread(); |
| 1096 | 1096 |
| 1097 // Read the symbols. | 1097 // Read the symbols. |
| 1098 if (!LoadSymbols(process_handle)) return kStackWalkError; | 1098 if (!LoadSymbols(Isolate::Current(), process_handle)) return kStackWalkError; |
| 1099 | 1099 |
| 1100 // Capture current context. | 1100 // Capture current context. |
| 1101 CONTEXT context; | 1101 CONTEXT context; |
| 1102 RtlCaptureContext(&context); | 1102 RtlCaptureContext(&context); |
| 1103 | 1103 |
| 1104 // Initialize the stack walking | 1104 // Initialize the stack walking |
| 1105 STACKFRAME64 stack_frame; | 1105 STACKFRAME64 stack_frame; |
| 1106 memset(&stack_frame, 0, sizeof(stack_frame)); | 1106 memset(&stack_frame, 0, sizeof(stack_frame)); |
| 1107 #ifdef _WIN64 | 1107 #ifdef _WIN64 |
| 1108 stack_frame.AddrPC.Offset = context.Rip; | 1108 stack_frame.AddrPC.Offset = context.Rip; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1194 | 1194 |
| 1195 // Return the number of frames filled in. | 1195 // Return the number of frames filled in. |
| 1196 return frames_count; | 1196 return frames_count; |
| 1197 } | 1197 } |
| 1198 | 1198 |
| 1199 | 1199 |
| 1200 // Restore warnings to previous settings. | 1200 // Restore warnings to previous settings. |
| 1201 #pragma warning(pop) | 1201 #pragma warning(pop) |
| 1202 | 1202 |
| 1203 #else // __MINGW32__ | 1203 #else // __MINGW32__ |
| 1204 void OS::LogSharedLibraryAddresses() { } | 1204 void OS::LogSharedLibraryAddresses(Isolate* isolate) { } |
| 1205 void OS::SignalCodeMovingGC() { } | 1205 void OS::SignalCodeMovingGC() { } |
| 1206 int OS::StackWalk(Vector<OS::StackFrame> frames) { return 0; } | 1206 int OS::StackWalk(Vector<OS::StackFrame> frames) { return 0; } |
| 1207 #endif // __MINGW32__ | 1207 #endif // __MINGW32__ |
| 1208 | 1208 |
| 1209 | 1209 |
| 1210 uint64_t OS::CpuFeaturesImpliedByPlatform() { | 1210 uint64_t OS::CpuFeaturesImpliedByPlatform() { |
| 1211 return 0; // Windows runs on anything. | 1211 return 0; // Windows runs on anything. |
| 1212 } | 1212 } |
| 1213 | 1213 |
| 1214 | 1214 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1333 ASSERT(result); | 1333 ASSERT(result); |
| 1334 } | 1334 } |
| 1335 | 1335 |
| 1336 | 1336 |
| 1337 | 1337 |
| 1338 void Thread::YieldCPU() { | 1338 void Thread::YieldCPU() { |
| 1339 Sleep(0); | 1339 Sleep(0); |
| 1340 } | 1340 } |
| 1341 | 1341 |
| 1342 } } // namespace v8::internal | 1342 } } // namespace v8::internal |
| OLD | NEW |