[Lldb-commits] [lldb] r116878 - in /lldb/trunk: include/lldb/Host/Host.h source/Commands/CommandObjectProcess.cpp source/Host/macosx/Host.mm

Greg Clayton gclayton at apple.com
Tue Oct 19 16:16:00 PDT 2010


Author: gclayton
Date: Tue Oct 19 18:16:00 2010
New Revision: 116878

URL: http://llvm.org/viewvc/llvm-project?rev=116878&view=rev
Log:
Ok, last commit for the running processes in a new window. Now you can 
optionally specify the tty you want to use if you want to use an existing
terminal window by giving a partial or full path name:

(lldb) process launch --tty=ttys002

This would find the terminal window (or tab on MacOSX) that has ttys002 in its
tty path and use it. If it isn't found, it will use a new terminal window.


Modified:
    lldb/trunk/include/lldb/Host/Host.h
    lldb/trunk/source/Commands/CommandObjectProcess.cpp
    lldb/trunk/source/Host/macosx/Host.mm

Modified: lldb/trunk/include/lldb/Host/Host.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/Host.h?rev=116878&r1=116877&r2=116878&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Host/Host.h (original)
+++ lldb/trunk/include/lldb/Host/Host.h Tue Oct 19 18:16:00 2010
@@ -310,7 +310,8 @@
     LaunchApplication (const FileSpec &app_file_spec);
 
     static lldb::pid_t
-    LaunchInNewTerminal (const char **argv,   // argv[0] is executable
+    LaunchInNewTerminal (const char *tty_name,  // Optional partial or full tty name ("/dev/ttys000" or "ttys000")
+                         const char **argv,   // argv[0] is executable
                          const char **envp,
                          const ArchSpec *arch_spec,
                          bool stop_at_entry,

Modified: lldb/trunk/source/Commands/CommandObjectProcess.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectProcess.cpp?rev=116878&r1=116877&r2=116878&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectProcess.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectProcess.cpp Tue Oct 19 18:16:00 2010
@@ -62,7 +62,11 @@
                 case 'i':   stdin_path  = option_arg;   break;
                 case 'o':   stdout_path = option_arg;   break;
                 case 'p':   plugin_name = option_arg;   break;
-                case 't':   in_new_tty = true; break;
+                case 't':   
+                    if (option_arg && option_arg[0])
+                        tty_name.assign (option_arg);
+                    in_new_tty = true; 
+                    break;
                 default:
                     error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option);
                     break;
@@ -77,6 +81,7 @@
             Options::ResetOptionValues();
             stop_at_entry = false;
             in_new_tty = false;
+            tty_name.clear();
             stdin_path.clear();
             stdout_path.clear();
             stderr_path.clear();
@@ -97,6 +102,7 @@
 
         bool stop_at_entry;
         bool in_new_tty;
+        std::string tty_name;
         std::string stderr_path;
         std::string stdin_path;
         std::string stdout_path;
@@ -216,7 +222,8 @@
         if (m_options.in_new_tty)
         {
         
-            lldb::pid_t pid = Host::LaunchInNewTerminal (inferior_argv,
+            lldb::pid_t pid = Host::LaunchInNewTerminal (m_options.tty_name.c_str(),
+                                                         inferior_argv,
                                                          inferior_envp,
                                                          &exe_module->GetArchitecture(),
                                                          true,
@@ -322,7 +329,7 @@
 { SET1       , false, "stdout",        'o', required_argument, NULL, 0, eArgTypePath,    "Redirect stdout for the process to <path>."},
 { SET1       , false, "stderr",        'e', required_argument, NULL, 0, eArgTypePath,    "Redirect stderr for the process to <path>."},
 { SET1 | SET2, false, "plugin",        'p', required_argument, NULL, 0, eArgTypePlugin,  "Name of the process plugin you want to use."},
-{        SET2, false, "tty",           't', no_argument,       NULL, 0, eArgTypeNone,    "Start the process in a new terminal (tty)."},
+{        SET2, false, "tty",           't', optional_argument, NULL, 0, eArgTypePath,    "Start the process in a terminal. If <path> is specified, look for a terminal whose name contains <path>, else start the process in a new terminal."},
 { 0,           false, NULL,             0,  0,                 NULL, 0, eArgTypeNone,    NULL }
 };
 

Modified: lldb/trunk/source/Host/macosx/Host.mm
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/macosx/Host.mm?rev=116878&r1=116877&r2=116878&view=diff
==============================================================================
--- lldb/trunk/source/Host/macosx/Host.mm (original)
+++ lldb/trunk/source/Host/macosx/Host.mm Tue Oct 19 18:16:00 2010
@@ -369,10 +369,35 @@
     return pid;
 }
 
+const char *applscript_in_new_tty = 
+"tell application \"Terminal\"\n"
+"	do script \"%s\"\n"
+"end tell\n";
+
+
+const char *applscript_in_existing_tty = "\
+set the_shell_script to \"%s\"\n\
+tell application \"Terminal\"\n\
+	repeat with the_window in (get windows)\n\
+		repeat with the_tab in tabs of the_window\n\
+			set the_tty to tty in the_tab\n\
+			if the_tty contains \"%s\" then\n\
+				if the_tab is not busy then\n\
+					set selected of the_tab to true\n\
+					set frontmost of the_window to true\n\
+					do script the_shell_script in the_tab\n\
+					return\n\
+				end if\n\
+			end if\n\
+		end repeat\n\
+	end repeat\n\
+	do script the_shell_script\n\
+end tell\n";
 
 lldb::pid_t
 LaunchInNewTerminalWithAppleScript
 (
+    const char *tty_name,
     const char **argv, 
     const char **envp,
     const ArchSpec *arch_spec,
@@ -392,7 +417,6 @@
     unix_socket_name.assign (temp_file_path);
     
     StreamString command;
-    
     FileSpec darwin_debug_file_spec;
     if (!Host::GetLLDBPath (ePathTypeSupportExecutableDir, darwin_debug_file_spec))
         return LLDB_INVALID_PROCESS_ID;
@@ -403,19 +427,14 @@
     
     char launcher_path[PATH_MAX];
     darwin_debug_file_spec.GetPath(launcher_path, sizeof(launcher_path));
-    command.Printf ("tell application \"Terminal\"\n    do script \"'%s'", launcher_path);
-    
-    command.Printf(" --unix-socket=%s", unix_socket_name.c_str());
+
+    command.Printf("'%s' --unix-socket=%s", launcher_path, unix_socket_name.c_str());
 
     if (arch_spec && arch_spec->IsValid())
-    {
         command.Printf(" --arch=%s", arch_spec->AsCString());
-    }
 
     if (disable_aslr)
-    {
         command.PutCString(" --disable-aslr");
-    }
         
     command.PutCString(" --");
 
@@ -426,8 +445,26 @@
             command.Printf(" '%s'", argv[i]);
         }
     }
-    command.PutCString (" ; echo Process exited with status $?\"\nend tell\n");
-    const char *script_source = command.GetString().c_str();
+    command.PutCString (" ; echo Process exited with status $?");
+    
+    StreamString applescript_source;
+
+    if (tty_name && tty_name[0])
+    {
+        applescript_source.Printf (applscript_in_existing_tty, 
+                                   command.GetString().c_str(),
+                                   tty_name);
+    }
+    else
+    {
+        applescript_source.Printf (applscript_in_new_tty, 
+                                   command.GetString().c_str());
+    }
+
+    
+
+    const char *script_source = applescript_source.GetString().c_str();
+    //puts (script_source);
     NSAppleScript* applescript = [[NSAppleScript alloc] initWithSource:[NSString stringWithCString:script_source encoding:NSUTF8StringEncoding]];
 
     lldb::pid_t pid = LLDB_INVALID_PROCESS_ID;
@@ -461,6 +498,7 @@
             WaitForProcessToSIGSTOP (pid, 5);
         }
     }
+    ::unlink (unix_socket_name.c_str());
     [applescript release];
     return pid;
 }
@@ -471,6 +509,7 @@
 lldb::pid_t
 Host::LaunchInNewTerminal 
 (
+    const char *tty_name,
     const char **argv, 
     const char **envp,
     const ArchSpec *arch_spec,
@@ -479,7 +518,7 @@
 )
 {
 #if defined (LLDB_HOST_USE_APPLESCRIPT)
-    return LaunchInNewTerminalWithAppleScript (argv, envp, arch_spec, stop_at_entry, disable_aslr);
+    return LaunchInNewTerminalWithAppleScript (tty_name, argv, envp, arch_spec, stop_at_entry, disable_aslr);
 #else
     return LaunchInNewTerminalWithCommandFile (argv, envp, arch_spec, stop_at_entry, disable_aslr);
 #endif





More information about the lldb-commits mailing list