summaryrefslogtreecommitdiffstats
path: root/lldb/source/Host/macosx
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Host/macosx')
-rw-r--r--lldb/source/Host/macosx/Host.mm41
1 files changed, 34 insertions, 7 deletions
diff --git a/lldb/source/Host/macosx/Host.mm b/lldb/source/Host/macosx/Host.mm
index c7c6e496747..8dec00b4867 100644
--- a/lldb/source/Host/macosx/Host.mm
+++ b/lldb/source/Host/macosx/Host.mm
@@ -13,6 +13,8 @@
#include <sys/stat.h>
#include "lldb/Core/ArchSpec.h"
+#include "lldb/Core/Communication.h"
+#include "lldb/Core/ConnectionFileDescriptor.h"
#include "lldb/Core/FileSpec.h"
#include "lldb/Core/Log.h"
#include "lldb/Core/StreamFile.h"
@@ -176,6 +178,8 @@ Host::LaunchInNewTerminal
FileSpec program (argv[0]);
+ std::string unix_socket_name;
+
char temp_file_path[PATH_MAX];
const char *tmpdir = ::getenv ("TMPDIR");
if (tmpdir == NULL)
@@ -185,6 +189,8 @@ Host::LaunchInNewTerminal
if (::mktemp (temp_file_path) == NULL)
return LLDB_INVALID_PROCESS_ID;
+ unix_socket_name.assign (temp_file_path);
+
::strncat (temp_file_path, ".command", sizeof (temp_file_path));
StreamFile command_file (temp_file_path, "w");
@@ -201,6 +207,8 @@ Host::LaunchInNewTerminal
darwin_debug_file_spec.GetPath(launcher_path, sizeof(launcher_path));
command_file.Printf("\"%s\" ", launcher_path);
+ command_file.Printf("--unix-socket=%s ", unix_socket_name.c_str());
+
if (arch_spec && arch_spec->IsValid())
{
command_file.Printf("--arch=%s ", arch_spec->AsCString());
@@ -253,7 +261,7 @@ Host::LaunchInNewTerminal
CFCReleaser<CFURLRef> command_file_url (::CFURLCreateFromFileSystemRepresentation (NULL,
(const UInt8 *)temp_file_path,
- strlen (temp_file_path),
+ strlen(temp_file_path),
false));
CFCMutableArray urls;
@@ -263,14 +271,33 @@ Host::LaunchInNewTerminal
// for us to attach.
urls.AppendValue(command_file_url.get());
- ProcessSerialNumber psn;
- error = LSOpenURLsWithRole(urls.get(), kLSRolesShell, NULL, &app_params, &psn, 1);
- if (error != noErr)
- return LLDB_INVALID_PROCESS_ID;
+ lldb::pid_t pid = LLDB_INVALID_PROCESS_ID;
- ::pid_t pid = LLDB_INVALID_PROCESS_ID;
- error = ::GetProcessPID(&psn, &pid);
+ Error lldb_error;
+ // Sleep and wait a bit for debugserver to start to listen...
+ ConnectionFileDescriptor file_conn;
+ char connect_url[128];
+ ::snprintf (connect_url, sizeof(connect_url), "unix-accept://%s", unix_socket_name.c_str());
+
+ ProcessSerialNumber psn;
+ error = LSOpenURLsWithRole(urls.get(), kLSRolesShell, NULL, &app_params, &psn, 1);
+ if (error == noErr)
+ {
+ if (file_conn.Connect(connect_url, &lldb_error) == eConnectionStatusSuccess)
+ {
+ char pid_str[256];
+ ::bzero (pid_str, sizeof(pid_str));
+ ConnectionStatus status;
+ const size_t pid_str_len = file_conn.Read (pid_str, sizeof(pid_str), status, NULL);
+ if (pid_str_len > 0)
+ {
+ pid = atoi (pid_str);
+ // Sleep for a bit to allow the process to exec and stop at the entry point...
+ sleep(1);
+ }
+ }
+ }
return pid;
}
OpenPOWER on IntegriCloud