diff options
author | Aleksandr Urakov <aleksandr.urakov@jetbrains.com> | 2019-04-29 07:29:25 +0000 |
---|---|---|
committer | Aleksandr Urakov <aleksandr.urakov@jetbrains.com> | 2019-04-29 07:29:25 +0000 |
commit | 26366c3e2cc0be09bc78e287982527c3f80caa61 (patch) | |
tree | caab0fbd6d51a5467aaa0cd8d00e2de614eaa1b7 /lldb/source/Plugins/Process/Windows | |
parent | ba45daab1417b099ec1743a3187320b5488775a4 (diff) | |
download | bcm5719-llvm-26366c3e2cc0be09bc78e287982527c3f80caa61.tar.gz bcm5719-llvm-26366c3e2cc0be09bc78e287982527c3f80caa61.zip |
[Windows] Dump more information about access violation exception
Summary:
Dump more information about "access violation" and "in page error" exceptions to
description. Description now contains data about read/write violation type and
actual address as described at
https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_exception_record
Reviewers: asmith, stella.stamenova
Reviewed By: stella.stamenova
Subscribers: teemperor, amccarth, abidh, lldb-commits, aleksandr.urakov
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D60519
llvm-svn: 359420
Diffstat (limited to 'lldb/source/Plugins/Process/Windows')
-rw-r--r-- | lldb/source/Plugins/Process/Windows/Common/ExceptionRecord.h | 2 | ||||
-rw-r--r-- | lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp | 70 |
2 files changed, 72 insertions, 0 deletions
diff --git a/lldb/source/Plugins/Process/Windows/Common/ExceptionRecord.h b/lldb/source/Plugins/Process/Windows/Common/ExceptionRecord.h index dcff8d34712..d1692a6926b 100644 --- a/lldb/source/Plugins/Process/Windows/Common/ExceptionRecord.h +++ b/lldb/source/Plugins/Process/Windows/Common/ExceptionRecord.h @@ -64,6 +64,8 @@ public: lldb::tid_t GetThreadID() const { return m_thread_id; } + const std::vector<ULONG_PTR>& GetExceptionArguments() const { return m_arguments; } + private: DWORD m_code; bool m_continuable; diff --git a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp index e891f6c2367..678ff52d906 100644 --- a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp +++ b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp @@ -474,6 +474,74 @@ void ProcessWindows::DidAttach(ArchSpec &arch_spec) { RefreshStateAfterStop(); } +static void +DumpAdditionalExceptionInformation(llvm::raw_ostream &stream, + const ExceptionRecordSP &exception) { + // Decode additional exception information for specific exception types based + // on + // https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_exception_record + + const int addr_min_width = 2 + 8; // "0x" + 4 address bytes + + const std::vector<ULONG_PTR> &args = exception->GetExceptionArguments(); + switch (exception->GetExceptionCode()) { + case EXCEPTION_ACCESS_VIOLATION: { + if (args.size() < 2) + break; + + stream << ": "; + const int access_violation_code = args[0]; + const lldb::addr_t access_violation_address = args[1]; + switch (access_violation_code) { + case 0: + stream << "Access violation reading"; + break; + case 1: + stream << "Access violation writing"; + break; + case 8: + stream << "User-mode data execution prevention (DEP) violation at"; + break; + default: + stream << "Unknown access violation (code " << access_violation_code + << ") at"; + break; + } + stream << " location " + << llvm::format_hex(access_violation_address, addr_min_width); + break; + } + case EXCEPTION_IN_PAGE_ERROR: { + if (args.size() < 3) + break; + + stream << ": "; + const int page_load_error_code = args[0]; + const lldb::addr_t page_load_error_address = args[1]; + const DWORD underlying_code = args[2]; + switch (page_load_error_code) { + case 0: + stream << "In page error reading"; + break; + case 1: + stream << "In page error writing"; + break; + case 8: + stream << "User-mode data execution prevention (DEP) violation at"; + break; + default: + stream << "Unknown page loading error (code " << page_load_error_code + << ") at"; + break; + } + stream << " location " + << llvm::format_hex(page_load_error_address, addr_min_width) + << " (status code " << llvm::format_hex(underlying_code, 8) << ")"; + break; + } + } +} + void ProcessWindows::RefreshStateAfterStop() { Log *log = ProcessWindowsLog::GetLogIfAny(WINDOWS_LOG_EXCEPTION); llvm::sys::ScopedLock lock(m_mutex); @@ -573,6 +641,8 @@ void ProcessWindows::RefreshStateAfterStop() { << llvm::format_hex(active_exception->GetExceptionCode(), 8) << " encountered at address " << llvm::format_hex(active_exception->GetExceptionAddress(), 8); + DumpAdditionalExceptionInformation(desc_stream, active_exception); + stop_info = StopInfo::CreateStopReasonWithException( *stop_thread, desc_stream.str().c_str()); stop_thread->SetStopInfo(stop_info); |