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,