gdbclient.py: don't use make to dump target info.
make dumpvar takes forever (~0.45s per variable on my machine), and the information we want from it is already available in the environment. Construct the paths we need ourselves, instead of relying on make to do it for us, shaving off about a second from a gdbclient.py invocation. Test: gdbclient.py -r ls Change-Id: I8c563da726c8f61a23e2eb701f2f272a4c71d713
This commit is contained in:
@@ -68,28 +68,12 @@ def parse_args():
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def dump_var(root, variable):
|
||||
make_args = ["make", "CALLED_FROM_SETUP=true",
|
||||
"BUILD_SYSTEM={}/build/core".format(root),
|
||||
"--no-print-directory", "-f",
|
||||
"{}/build/core/config.mk".format(root),
|
||||
"dumpvar-{}".format(variable)]
|
||||
|
||||
# subprocess cwd argument does not change the PWD shell variable, but
|
||||
# dumpvar.mk uses PWD to create an absolute path, so we need to set it.
|
||||
saved_pwd = os.environ['PWD']
|
||||
os.environ['PWD'] = root
|
||||
make_output = subprocess.check_output(make_args, cwd=root)
|
||||
os.environ['PWD'] = saved_pwd
|
||||
return make_output.splitlines()[0]
|
||||
|
||||
|
||||
def verify_device(root, device):
|
||||
names = set([device.get_prop("ro.build.product"), device.get_prop("ro.product.device")])
|
||||
target_device = dump_var(root, "TARGET_DEVICE")
|
||||
if target_device not in names:
|
||||
msg = "TARGET_DEVICE ({}) does not match attached device ({})"
|
||||
sys.exit(msg.format(target_device, ", ".join(names)))
|
||||
name = device.get_prop("ro.product.name")
|
||||
target_device = os.environ["TARGET_PRODUCT"]
|
||||
if target_device != name:
|
||||
msg = "TARGET_PRODUCT ({}) does not match attached device ({})"
|
||||
sys.exit(msg.format(target_device, name))
|
||||
|
||||
|
||||
def get_remote_pid(device, process_name):
|
||||
@@ -169,6 +153,7 @@ def handle_switches(args, sysroot):
|
||||
|
||||
return (binary_file, pid, run_cmd)
|
||||
|
||||
|
||||
def generate_gdb_script(sysroot, binary_file, is64bit, port, connect_timeout=5):
|
||||
# Generate a gdb script.
|
||||
# TODO: Detect the zygote and run 'art-on' automatically.
|
||||
@@ -226,6 +211,13 @@ end
|
||||
|
||||
|
||||
def main():
|
||||
required_env = ["ANDROID_BUILD_TOP",
|
||||
"ANDROID_PRODUCT_OUT", "TARGET_PRODUCT"]
|
||||
for env in required_env:
|
||||
if env not in os.environ:
|
||||
sys.exit(
|
||||
"Environment variable '{}' not defined, have you run lunch?".format(env))
|
||||
|
||||
args = parse_args()
|
||||
device = args.device
|
||||
|
||||
@@ -233,7 +225,7 @@ def main():
|
||||
sys.exit("ERROR: Failed to find device.")
|
||||
|
||||
root = os.environ["ANDROID_BUILD_TOP"]
|
||||
sysroot = dump_var(root, "abs-TARGET_OUT_UNSTRIPPED")
|
||||
sysroot = os.path.join(os.environ["ANDROID_PRODUCT_OUT"], "symbols")
|
||||
|
||||
# Make sure the environment matches the attached device.
|
||||
verify_device(root, device)
|
||||
|
||||
Reference in New Issue
Block a user