summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/Windows
diff options
context:
space:
mode:
authorAleksandr Urakov <aleksandr.urakov@jetbrains.com>2019-04-29 07:29:25 +0000
committerAleksandr Urakov <aleksandr.urakov@jetbrains.com>2019-04-29 07:29:25 +0000
commit26366c3e2cc0be09bc78e287982527c3f80caa61 (patch)
treecaab0fbd6d51a5467aaa0cd8d00e2de614eaa1b7 /lldb/source/Plugins/Process/Windows
parentba45daab1417b099ec1743a3187320b5488775a4 (diff)
downloadbcm5719-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.h2
-rw-r--r--lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp70
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);
OpenPOWER on IntegriCloud