mirror of
https://github.com/chromium/crashpad.git
synced 2025-03-17 08:33:54 +00:00
linux: override exception thread ID
When a crash dump request is received over a socket, the message includes a stack address of the thread requesting the dump. This can be used to override the ExceptionInfo's thread ID which may be incorrect in the handler's PID namespace. Bug: crashpad:286 Change-Id: I053cf709c5eeefb73b31328f16a806510e1bd35d Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/1759280 Reviewed-by: Mark Mentovai <mark@chromium.org> Commit-Queue: Joshua Peraza <jperaza@chromium.org>
This commit is contained in:
parent
ec56fc6a38
commit
3a6c6012ba
@ -95,13 +95,18 @@ bool CrashReportExceptionHandler::HandleExceptionWithConnection(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (requesting_thread_id && requesting_thread_stack_address) {
|
pid_t local_requesting_thread_id = -1;
|
||||||
*requesting_thread_id = process_snapshot.FindThreadWithStackAddress(
|
if (requesting_thread_stack_address) {
|
||||||
|
local_requesting_thread_id = process_snapshot.FindThreadWithStackAddress(
|
||||||
requesting_thread_stack_address);
|
requesting_thread_stack_address);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!process_snapshot.InitializeException(
|
if (requesting_thread_id) {
|
||||||
info.exception_information_address)) {
|
*requesting_thread_id = local_requesting_thread_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!process_snapshot.InitializeException(info.exception_information_address,
|
||||||
|
local_requesting_thread_id)) {
|
||||||
Metrics::ExceptionCaptureResult(
|
Metrics::ExceptionCaptureResult(
|
||||||
Metrics::CaptureResult::kExceptionInitializationFailed);
|
Metrics::CaptureResult::kExceptionInitializationFailed);
|
||||||
return false;
|
return false;
|
||||||
|
@ -64,7 +64,8 @@ pid_t ProcessSnapshotLinux::FindThreadWithStackAddress(
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool ProcessSnapshotLinux::InitializeException(
|
bool ProcessSnapshotLinux::InitializeException(
|
||||||
LinuxVMAddress exception_info_address) {
|
LinuxVMAddress exception_info_address,
|
||||||
|
pid_t exception_thread_id) {
|
||||||
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
INITIALIZATION_STATE_DCHECK_VALID(initialized_);
|
||||||
DCHECK(!exception_);
|
DCHECK(!exception_);
|
||||||
|
|
||||||
@ -75,6 +76,10 @@ bool ProcessSnapshotLinux::InitializeException(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (exception_thread_id >= 0) {
|
||||||
|
info.thread_id = exception_thread_id;
|
||||||
|
}
|
||||||
|
|
||||||
exception_.reset(new internal::ExceptionSnapshotLinux());
|
exception_.reset(new internal::ExceptionSnapshotLinux());
|
||||||
if (!exception_->Initialize(&process_reader_,
|
if (!exception_->Initialize(&process_reader_,
|
||||||
info.siginfo_address,
|
info.siginfo_address,
|
||||||
|
@ -70,7 +70,12 @@ class ProcessSnapshotLinux final : public ProcessSnapshot {
|
|||||||
//!
|
//!
|
||||||
//! \param[in] exception_info The address of an ExceptionInformation in the
|
//! \param[in] exception_info The address of an ExceptionInformation in the
|
||||||
//! target process' address space.
|
//! target process' address space.
|
||||||
bool InitializeException(LinuxVMAddress exception_info);
|
//! \param[in] exception_thread_id The thread ID to assocaite the thread with.
|
||||||
|
//! Optional. If -1, the exception thread will be identified by the
|
||||||
|
//! ExceptionInformation struct which contains the thread ID in the target
|
||||||
|
//! process' namespace.
|
||||||
|
bool InitializeException(LinuxVMAddress exception_info,
|
||||||
|
pid_t exception_thread_id = -1);
|
||||||
|
|
||||||
//! \brief Sets the value to be returned by ReportID().
|
//! \brief Sets the value to be returned by ReportID().
|
||||||
//!
|
//!
|
||||||
|
Loading…
x
Reference in New Issue
Block a user