Fix gdbclient.py -p.

Bug: http://b/26413900
Test: manually ran gdbserver on device, connected with -p
Change-Id: If58b95e52167c38263e77fe85bea14e0d7401bf4
diff --git a/python-packages/gdbrunner/__init__.py b/python-packages/gdbrunner/__init__.py
index cfe6129..9cc6fb7 100644
--- a/python-packages/gdbrunner/__init__.py
+++ b/python-packages/gdbrunner/__init__.py
@@ -167,9 +167,7 @@
     else:
         gdbserver_cmd += run_cmd
 
-    device.forward("tcp:{}".format(port),
-                   "localfilesystem:{}".format(debug_socket))
-    atexit.register(lambda: device.forward_remove("tcp:{}".format(port)))
+    forward_gdbserver_port(device, local=port, remote="localfilesystem:{}".format(debug_socket))
 
     if run_as_cmd:
         gdbserver_cmd = run_as_cmd + gdbserver_cmd
@@ -182,6 +180,12 @@
                               stderr=gdbserver_output)
 
 
+def forward_gdbserver_port(device, local, remote):
+    """Forwards local TCP port `port` to `remote` via `adb forward`."""
+    device.forward("tcp:{}".format(local), remote)
+    atexit.register(lambda: device.forward_remove("tcp:{}".format(local)))
+
+
 def find_file(device, executable_path, sysroot, run_as_cmd=None):
     """Finds a device executable file.
 
diff --git a/scripts/gdbclient.py b/scripts/gdbclient.py
index b5134c3..2e37e0b 100755
--- a/scripts/gdbclient.py
+++ b/scripts/gdbclient.py
@@ -19,6 +19,7 @@
 import argparse
 import logging
 import os
+import re
 import subprocess
 import sys
 
@@ -33,6 +34,15 @@
         return path.format(root, arch, "", "")
 
 
+def get_tracer_pid(device, pid):
+    if pid is None:
+        return 0
+
+    line, _ = device.shell(["grep", "-e", "^TracerPid:", "/proc/{}/status".format(pid)])
+    tracer_pid = re.sub('TracerPid:\t(.*)\n', r'\1', line)
+    return int(tracer_pid)
+
+
 def parse_args():
     parser = gdbrunner.ArgumentParser()
 
@@ -50,7 +60,7 @@
 
     parser.add_argument(
         "--port", nargs="?", default="5039",
-        help="override the port used on the host")
+        help="override the port used on the host [default: 5039]")
     parser.add_argument(
         "--user", nargs="?", default="root",
         help="user to run commands as on the device [default: root]")
@@ -236,13 +246,19 @@
         # Make sure we have the linker
         ensure_linker(device, sysroot, is64bit)
 
-        # Start gdbserver.
-        gdbserver_local_path = get_gdbserver_path(root, arch)
-        gdbserver_remote_path = "/data/local/tmp/{}-gdbserver".format(arch)
-        gdbrunner.start_gdbserver(
-            device, gdbserver_local_path, gdbserver_remote_path,
-            target_pid=pid, run_cmd=run_cmd, debug_socket=debug_socket,
-            port=args.port, run_as_cmd=args.su_cmd)
+        tracer_pid = get_tracer_pid(device, pid)
+        if tracer_pid == 0:
+            # Start gdbserver.
+            gdbserver_local_path = get_gdbserver_path(root, arch)
+            gdbserver_remote_path = "/data/local/tmp/{}-gdbserver".format(arch)
+            gdbrunner.start_gdbserver(
+                device, gdbserver_local_path, gdbserver_remote_path,
+                target_pid=pid, run_cmd=run_cmd, debug_socket=debug_socket,
+                port=args.port, run_as_cmd=args.su_cmd)
+        else:
+            print "Connecting to tracing pid {} using local port {}".format(tracer_pid, args.port)
+            gdbrunner.forward_gdbserver_port(device, local=args.port,
+                                             remote="tcp:{}".format(args.port))
 
         # Generate a gdb script.
         gdb_commands = generate_gdb_script(sysroot=sysroot,