diff options
Diffstat (limited to 'lldb/source/Host/macosx')
| -rw-r--r-- | lldb/source/Host/macosx/Host.mm | 41 |
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; } |

