summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-11-29 20:50:10 +0000
committerGreg Clayton <gclayton@apple.com>2011-11-29 20:50:10 +0000
commit28041352cb05b0da78da40667dbc6c9f1819f36a (patch)
treec97b89324fc7c96550d0ae0a5238ae4c33007eea /lldb/source/Plugins/Process
parent31798ef3c0bb04791ad0e68b60bdb89ec8599379 (diff)
downloadbcm5719-llvm-28041352cb05b0da78da40667dbc6c9f1819f36a.tar.gz
bcm5719-llvm-28041352cb05b0da78da40667dbc6c9f1819f36a.zip
Patch from Dawn that fixes up linux debugging and a first passs at an
implementation of the linux platform. llvm-svn: 145433
Diffstat (limited to 'lldb/source/Plugins/Process')
-rw-r--r--lldb/source/Plugins/Process/Linux/ProcessLinux.cpp12
-rw-r--r--lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp40
-rw-r--r--lldb/source/Plugins/Process/Linux/ProcessMonitor.h12
3 files changed, 47 insertions, 17 deletions
diff --git a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp
index 6a0c54c36ad..2171a6dbb2f 100644
--- a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp
+++ b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp
@@ -87,7 +87,6 @@ ProcessLinux::ProcessLinux(Target& target, Listener &listener)
m_in_limbo(false),
m_exit_now(false)
{
-
#if 0
// FIXME: Putting this code in the ctor and saving the byte order in a
// member variable is a hack to avoid const qual issues in GetByteOrder.
@@ -152,7 +151,6 @@ ProcessLinux::DoLaunch (Module *module,
SetPrivateState(eStateLaunching);
- uint32_t launch_flags = launch_info.GetFlags().Get();
const char *stdin_path = NULL;
const char *stdout_path = NULL;
const char *stderr_path = NULL;
@@ -270,7 +268,13 @@ ProcessLinux::DoHalt(bool &caused_stop)
Error
ProcessLinux::DoDetach()
{
- return Error(1, eErrorTypeGeneric);
+ Error error;
+
+ error = m_monitor->Detach();
+ if (error.Success())
+ SetPrivateState(eStateDetached);
+
+ return error;
}
Error
@@ -388,7 +392,7 @@ bool
ProcessLinux::IsAlive()
{
StateType state = GetPrivateState();
- return state != eStateExited && state != eStateInvalid;
+ return state != eStateDetached && state != eStateExited && state != eStateInvalid;
}
size_t
diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp
index 2a844623080..c154c5555db 100644
--- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp
+++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp
@@ -722,6 +722,30 @@ KillOperation::Execute(ProcessMonitor *monitor)
m_result = true;
}
+//------------------------------------------------------------------------------
+/// @class KillOperation
+/// @brief Implements ProcessMonitor::BringProcessIntoLimbo.
+class DetachOperation : public Operation
+{
+public:
+ DetachOperation(Error &result) : m_error(result) { }
+
+ void Execute(ProcessMonitor *monitor);
+
+private:
+ Error &m_error;
+};
+
+void
+DetachOperation::Execute(ProcessMonitor *monitor)
+{
+ lldb::pid_t pid = monitor->GetPID();
+
+ if (ptrace(PT_DETACH, pid, NULL, 0) < 0)
+ m_error.SetErrorToErrno();
+
+}
+
ProcessMonitor::OperationArgs::OperationArgs(ProcessMonitor *monitor)
: m_monitor(monitor)
{
@@ -1220,7 +1244,7 @@ ProcessMonitor::MonitorCallback(void *callback_baton,
ProcessMessage
ProcessMonitor::MonitorSIGTRAP(ProcessMonitor *monitor,
- const struct siginfo *info, lldb::pid_t pid)
+ const siginfo_t *info, lldb::pid_t pid)
{
ProcessMessage message;
@@ -1261,7 +1285,7 @@ ProcessMonitor::MonitorSIGTRAP(ProcessMonitor *monitor,
ProcessMessage
ProcessMonitor::MonitorSignal(ProcessMonitor *monitor,
- const struct siginfo *info, lldb::pid_t pid)
+ const siginfo_t *info, lldb::pid_t pid)
{
ProcessMessage message;
int signo = info->si_signo;
@@ -1312,7 +1336,7 @@ ProcessMonitor::MonitorSignal(ProcessMonitor *monitor,
}
ProcessMessage::CrashReason
-ProcessMonitor::GetCrashReasonForSIGSEGV(const struct siginfo *info)
+ProcessMonitor::GetCrashReasonForSIGSEGV(const siginfo_t *info)
{
ProcessMessage::CrashReason reason;
assert(info->si_signo == SIGSEGV);
@@ -1336,7 +1360,7 @@ ProcessMonitor::GetCrashReasonForSIGSEGV(const struct siginfo *info)
}
ProcessMessage::CrashReason
-ProcessMonitor::GetCrashReasonForSIGILL(const struct siginfo *info)
+ProcessMonitor::GetCrashReasonForSIGILL(const siginfo_t *info)
{
ProcessMessage::CrashReason reason;
assert(info->si_signo == SIGILL);
@@ -1378,7 +1402,7 @@ ProcessMonitor::GetCrashReasonForSIGILL(const struct siginfo *info)
}
ProcessMessage::CrashReason
-ProcessMonitor::GetCrashReasonForSIGFPE(const struct siginfo *info)
+ProcessMonitor::GetCrashReasonForSIGFPE(const siginfo_t *info)
{
ProcessMessage::CrashReason reason;
assert(info->si_signo == SIGFPE);
@@ -1420,7 +1444,7 @@ ProcessMonitor::GetCrashReasonForSIGFPE(const struct siginfo *info)
}
ProcessMessage::CrashReason
-ProcessMonitor::GetCrashReasonForSIGBUS(const struct siginfo *info)
+ProcessMonitor::GetCrashReasonForSIGBUS(const siginfo_t *info)
{
ProcessMessage::CrashReason reason;
assert(info->si_signo == SIGBUS);
@@ -1646,7 +1670,9 @@ bool
ProcessMonitor::Detach()
{
bool result;
- KillOperation op(result);
+ lldb_private::Error error;
+ DetachOperation op(error);
+ result = error.Success();
DoOperation(&op);
StopMonitor();
return result;
diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.h b/lldb/source/Plugins/Process/Linux/ProcessMonitor.h
index ba6a76d7ab5..fdccb67745a 100644
--- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.h
+++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.h
@@ -257,23 +257,23 @@ private:
static ProcessMessage
MonitorSIGTRAP(ProcessMonitor *monitor,
- const struct siginfo *info, lldb::pid_t pid);
+ const siginfo_t *info, lldb::pid_t pid);
static ProcessMessage
MonitorSignal(ProcessMonitor *monitor,
- const struct siginfo *info, lldb::pid_t pid);
+ const siginfo_t *info, lldb::pid_t pid);
static ProcessMessage::CrashReason
- GetCrashReasonForSIGSEGV(const struct siginfo *info);
+ GetCrashReasonForSIGSEGV(const siginfo_t *info);
static ProcessMessage::CrashReason
- GetCrashReasonForSIGILL(const struct siginfo *info);
+ GetCrashReasonForSIGILL(const siginfo_t *info);
static ProcessMessage::CrashReason
- GetCrashReasonForSIGFPE(const struct siginfo *info);
+ GetCrashReasonForSIGFPE(const siginfo_t *info);
static ProcessMessage::CrashReason
- GetCrashReasonForSIGBUS(const struct siginfo *info);
+ GetCrashReasonForSIGBUS(const siginfo_t *info);
void
DoOperation(Operation *op);
OpenPOWER on IntegriCloud