| Index: src/platform-win32.cc
|
| diff --git a/src/platform-win32.cc b/src/platform-win32.cc
|
| index ea4f7ea11f4177bdbee4f5de2dca570e50985741..073b21a011aae732b7db5dc15ca3b18c85e3858b 100644
|
| --- a/src/platform-win32.cc
|
| +++ b/src/platform-win32.cc
|
| @@ -1208,133 +1208,9 @@ void OS::SignalCodeMovingGC() {
|
| }
|
|
|
|
|
| -// Walk the stack using the facilities in dbghelp.dll and tlhelp32.dll
|
| -
|
| -// Switch off warning 4748 (/GS can not protect parameters and local variables
|
| -// from local buffer overrun because optimizations are disabled in function) as
|
| -// it is triggered by the use of inline assembler.
|
| -#pragma warning(push)
|
| -#pragma warning(disable : 4748)
|
| -int OS::StackWalk(Vector<OS::StackFrame> frames) {
|
| - BOOL ok;
|
| -
|
| - // Load the required functions from DLL's.
|
| - if (!LoadDbgHelpAndTlHelp32()) return kStackWalkError;
|
| -
|
| - // Get the process and thread handles.
|
| - HANDLE process_handle = GetCurrentProcess();
|
| - HANDLE thread_handle = GetCurrentThread();
|
| -
|
| - // Read the symbols.
|
| - if (!LoadSymbols(Isolate::Current(), process_handle)) return kStackWalkError;
|
| -
|
| - // Capture current context.
|
| - CONTEXT context;
|
| - RtlCaptureContext(&context);
|
| -
|
| - // Initialize the stack walking
|
| - STACKFRAME64 stack_frame;
|
| - memset(&stack_frame, 0, sizeof(stack_frame));
|
| -#ifdef _WIN64
|
| - stack_frame.AddrPC.Offset = context.Rip;
|
| - stack_frame.AddrFrame.Offset = context.Rbp;
|
| - stack_frame.AddrStack.Offset = context.Rsp;
|
| -#else
|
| - stack_frame.AddrPC.Offset = context.Eip;
|
| - stack_frame.AddrFrame.Offset = context.Ebp;
|
| - stack_frame.AddrStack.Offset = context.Esp;
|
| -#endif
|
| - stack_frame.AddrPC.Mode = AddrModeFlat;
|
| - stack_frame.AddrFrame.Mode = AddrModeFlat;
|
| - stack_frame.AddrStack.Mode = AddrModeFlat;
|
| - int frames_count = 0;
|
| -
|
| - // Collect stack frames.
|
| - int frames_size = frames.length();
|
| - while (frames_count < frames_size) {
|
| - ok = _StackWalk64(
|
| - IMAGE_FILE_MACHINE_I386, // MachineType
|
| - process_handle, // hProcess
|
| - thread_handle, // hThread
|
| - &stack_frame, // StackFrame
|
| - &context, // ContextRecord
|
| - NULL, // ReadMemoryRoutine
|
| - _SymFunctionTableAccess64, // FunctionTableAccessRoutine
|
| - _SymGetModuleBase64, // GetModuleBaseRoutine
|
| - NULL); // TranslateAddress
|
| - if (!ok) break;
|
| -
|
| - // Store the address.
|
| - ASSERT((stack_frame.AddrPC.Offset >> 32) == 0); // 32-bit address.
|
| - frames[frames_count].address =
|
| - reinterpret_cast<void*>(stack_frame.AddrPC.Offset);
|
| -
|
| - // Try to locate a symbol for this frame.
|
| - DWORD64 symbol_displacement;
|
| - SmartArrayPointer<IMAGEHLP_SYMBOL64> symbol(
|
| - NewArray<IMAGEHLP_SYMBOL64>(kStackWalkMaxNameLen));
|
| - if (symbol.is_empty()) return kStackWalkError; // Out of memory.
|
| - memset(*symbol, 0, sizeof(IMAGEHLP_SYMBOL64) + kStackWalkMaxNameLen);
|
| - (*symbol)->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
|
| - (*symbol)->MaxNameLength = kStackWalkMaxNameLen;
|
| - ok = _SymGetSymFromAddr64(process_handle, // hProcess
|
| - stack_frame.AddrPC.Offset, // Address
|
| - &symbol_displacement, // Displacement
|
| - *symbol); // Symbol
|
| - if (ok) {
|
| - // Try to locate more source information for the symbol.
|
| - IMAGEHLP_LINE64 Line;
|
| - memset(&Line, 0, sizeof(Line));
|
| - Line.SizeOfStruct = sizeof(Line);
|
| - DWORD line_displacement;
|
| - ok = _SymGetLineFromAddr64(
|
| - process_handle, // hProcess
|
| - stack_frame.AddrPC.Offset, // dwAddr
|
| - &line_displacement, // pdwDisplacement
|
| - &Line); // Line
|
| - // Format a text representation of the frame based on the information
|
| - // available.
|
| - if (ok) {
|
| - SNPrintF(MutableCStrVector(frames[frames_count].text,
|
| - kStackWalkMaxTextLen),
|
| - "%s %s:%d:%d",
|
| - (*symbol)->Name, Line.FileName, Line.LineNumber,
|
| - line_displacement);
|
| - } else {
|
| - SNPrintF(MutableCStrVector(frames[frames_count].text,
|
| - kStackWalkMaxTextLen),
|
| - "%s",
|
| - (*symbol)->Name);
|
| - }
|
| - // Make sure line termination is in place.
|
| - frames[frames_count].text[kStackWalkMaxTextLen - 1] = '\0';
|
| - } else {
|
| - // No text representation of this frame
|
| - frames[frames_count].text[0] = '\0';
|
| -
|
| - // Continue if we are just missing a module (for non C/C++ frames a
|
| - // module will never be found).
|
| - int err = GetLastError();
|
| - if (err != ERROR_MOD_NOT_FOUND) {
|
| - break;
|
| - }
|
| - }
|
| -
|
| - frames_count++;
|
| - }
|
| -
|
| - // Return the number of frames filled in.
|
| - return frames_count;
|
| -}
|
| -
|
| -
|
| -// Restore warnings to previous settings.
|
| -#pragma warning(pop)
|
| -
|
| #else // __MINGW32__
|
| void OS::LogSharedLibraryAddresses(Isolate* isolate) { }
|
| void OS::SignalCodeMovingGC() { }
|
| -int OS::StackWalk(Vector<OS::StackFrame> frames) { return 0; }
|
| #endif // __MINGW32__
|
|
|
|
|
|
|