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 if device is None: sys.exit("ERROR: Failed to find device.") root = os.environ["ANDROID_BUILD_TOP"] sysroot = os.path.join(os.environ["ANDROID_PRODUCT_OUT"], "symbols") # Make sure the environment matches the attached device. verify_device(root, device) debug_socket = "/data/local/tmp/debug_socket" pid = None run_cmd = None # Fetch binary for -p, -n. binary_file, pid, run_cmd = handle_switches(args, sysroot) with binary_file: arch = gdbrunner.get_binary_arch(binary_file) is64bit = arch.endswith("64") # Make sure we have the linker ensure_linker(device, sysroot, is64bit) tracer_pid = get_tracer_pid(device, pid) if tracer_pid == 0: cmd_prefix = args.su_cmd if args.env: cmd_prefix += ['env'] + [v[0] for v in args.env] # 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=cmd_prefix) 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)) # Find where gdb is if sys.platform.startswith("linux"): platform_name = "linux-x86" elif sys.platform.startswith("darwin"): platform_name = "darwin-x86" else: sys.exit("Unknown platform: {}".format(sys.platform)) gdb_path = os.path.join(root, "prebuilts", "gdb", platform_name, "bin", "gdb") # Generate a gdb script. setup_commands = generate_setup_script(gdbpath=gdb_path, sysroot=sysroot, binary_file=binary_file, is64bit=is64bit, port=args.port, debugger=args.setup_forwarding or "gdb") if not args.setup_forwarding: # Print a newline to separate our messages from the GDB session. print("") # Start gdb. gdbrunner.start_gdb(gdb_path, setup_commands) else: print("") print setup_commands print("") if args.setup_forwarding == "vscode": print textwrap.dedent(""" Paste the above json into .vscode/launch.json and start the debugger as normal. Press enter in this terminal once debugging is finished to shutdown the gdbserver and close all the ports.""") else: print textwrap.dedent(""" Paste the above gdb commands into the gdb frontend to setup the gdbserver connection. Press enter in this terminal once debugging is finished to shutdown the gdbserver and close all the ports.""") print("") raw_input("Press enter to shutdown gdbserver")
def do_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 if device is None: sys.exit("ERROR: Failed to find device.") root = os.environ["ANDROID_BUILD_TOP"] sysroot = os.path.join(os.environ["ANDROID_PRODUCT_OUT"], "symbols") # Make sure the environment matches the attached device. verify_device(root, device) debug_socket = "/data/local/tmp/debug_socket" pid = None run_cmd = None # Fetch binary for -p, -n. binary_file, pid, run_cmd = handle_switches(args, sysroot) with binary_file: if sys.platform.startswith("linux"): platform_name = "linux-x86" elif sys.platform.startswith("darwin"): platform_name = "darwin-x86" else: sys.exit("Unknown platform: {}".format(sys.platform)) arch = gdbrunner.get_binary_arch(binary_file) is64bit = arch.endswith("64") # Make sure we have the linker clang_base, clang_version = read_toolchain_config(root) toolchain_path = os.path.join(root, clang_base, platform_name, clang_version) llvm_readobj_path = os.path.join(toolchain_path, "bin", "llvm-readobj") interp = gdbrunner.get_binary_interp(binary_file.name, llvm_readobj_path) linker_search_dir = ensure_linker(device, sysroot, interp) tracer_pid = get_tracer_pid(device, pid) if os.path.basename(__file__) == 'gdbclient.py' and not args.lldb: print("gdb is deprecated in favor of lldb. " "If you can't use lldb, please set --no-lldb and file a bug asap.") use_lldb = not args.no_lldb if tracer_pid == 0: cmd_prefix = args.su_cmd if args.env: cmd_prefix += ['env'] + [v[0] for v in args.env] # Start gdbserver. if use_lldb: server_local_path = get_lldb_server_path( root, clang_base, clang_version, arch) server_remote_path = "/data/local/tmp/{}-lldb-server".format( arch) else: server_local_path = get_gdbserver_path(root, arch) server_remote_path = "/data/local/tmp/{}-gdbserver".format( arch) gdbrunner.start_gdbserver( device, server_local_path, server_remote_path, target_pid=pid, run_cmd=run_cmd, debug_socket=debug_socket, port=args.port, run_as_cmd=cmd_prefix, lldb=use_lldb) 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)) if use_lldb: debugger_path = get_lldb_path(toolchain_path) debugger = 'lldb' else: debugger_path = os.path.join( root, "prebuilts", "gdb", platform_name, "bin", "gdb") debugger = args.setup_forwarding or "gdb" # Generate a gdb script. setup_commands = generate_setup_script(debugger_path=debugger_path, sysroot=sysroot, linker_search_dir=linker_search_dir, binary_file=binary_file, is64bit=is64bit, port=args.port, debugger=debugger) if use_lldb or not args.setup_forwarding: # Print a newline to separate our messages from the GDB session. print("") # Start gdb. gdbrunner.start_gdb(debugger_path, setup_commands, lldb=use_lldb) else: print("") print(setup_commands) print("") if args.setup_forwarding == "vscode": print(textwrap.dedent(""" Paste the above json into .vscode/launch.json and start the debugger as normal. Press enter in this terminal once debugging is finished to shutdown the gdbserver and close all the ports.""")) else: print(textwrap.dedent(""" Paste the above gdb commands into the gdb frontend to setup the gdbserver connection. Press enter in this terminal once debugging is finished to shutdown the gdbserver and close all the ports.""")) print("") raw_input("Press enter to shutdown gdbserver")
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 if device is None: sys.exit("ERROR: Failed to find device.") root = os.environ["ANDROID_BUILD_TOP"] sysroot = os.path.join(os.environ["ANDROID_PRODUCT_OUT"], "symbols") # Make sure the environment matches the attached device. verify_device(root, device) debug_socket = "/data/local/tmp/debug_socket" pid = None run_cmd = None # Fetch binary for -p, -n. binary_file, pid, run_cmd = handle_switches(args, sysroot) with binary_file: arch = gdbrunner.get_binary_arch(binary_file) is64bit = arch.endswith("64") # Make sure we have the linker ensure_linker(device, sysroot, is64bit) tracer_pid = get_tracer_pid(device, pid) if tracer_pid == 0: cmd_prefix = args.su_cmd if args.env: cmd_prefix += ['env'] + [v[0] for v in args.env] # 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=cmd_prefix) 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)) # Find where gdb is if sys.platform.startswith("linux"): platform_name = "linux-x86" elif sys.platform.startswith("darwin"): platform_name = "darwin-x86" else: sys.exit("Unknown platform: {}".format(sys.platform)) gdb_path = os.path.join(root, "prebuilts", "gdb", platform_name, "bin", "gdb") # Generate a gdb script. setup_commands = generate_setup_script(gdbpath=gdb_path, sysroot=sysroot, binary_file=binary_file, is64bit=is64bit, port=args.port, debugger=args.setup_forwarding or "gdb") if not args.setup_forwarding: # Print a newline to separate our messages from the GDB session. print("") # Start gdb. gdbrunner.start_gdb(gdb_path, setup_commands) else: print("") print setup_commands print("") if args.setup_forwarding == "vscode": print textwrap.dedent(""" Paste the above json into .vscode/launch.json and start the debugger as normal. Press enter in this terminal once debugging is finished to shutdown the gdbserver and close all the ports.""") else: print textwrap.dedent(""" Paste the above gdb commands into the gdb frontend to setup the gdbserver connection. Press enter in this terminal once debugging is finished to shutdown the gdbserver and close all the ports.""") print("") raw_input("Press enter to shutdown gdbserver")
def main(): args = parse_args() device = args.device if device is None: sys.exit("ERROR: Failed to find device.") root = os.environ["ANDROID_BUILD_TOP"] sysroot = dump_var(root, "abs-TARGET_OUT_UNSTRIPPED") # Make sure the environment matches the attached device. verify_device(root, device) debug_socket = "/data/local/tmp/debug_socket" pid = None run_cmd = None # Fetch binary for -p, -n. binary_file, pid, run_cmd = handle_switches(args, sysroot) with binary_file: arch = gdbrunner.get_binary_arch(binary_file) is64bit = arch.endswith("64") # Make sure we have the linker ensure_linker(device, sysroot, is64bit) 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, binary_file=binary_file, is64bit=is64bit, port=args.port) # Find where gdb is if sys.platform.startswith("linux"): platform_name = "linux-x86" elif sys.platform.startswith("darwin"): platform_name = "darwin-x86" else: sys.exit("Unknown platform: {}".format(sys.platform)) gdb_path = os.path.join(root, "prebuilts", "gdb", platform_name, "bin", "gdb") # Print a newline to separate our messages from the GDB session. print("") # Start gdb. gdbrunner.start_gdb(gdb_path, gdb_commands)
def main(): args = parse_args() device = args.device if device is None: sys.exit("ERROR: Failed to find device.") root = os.environ["ANDROID_BUILD_TOP"] sysroot = dump_var(root, "abs-TARGET_OUT_UNSTRIPPED") # Make sure the environment matches the attached device. verify_device(root, device) debug_socket = "/data/local/tmp/debug_socket" pid = None run_cmd = None # Fetch binary for -p, -n. binary_file, pid, run_cmd = handle_switches(args, sysroot) with binary_file: arch = gdbrunner.get_binary_arch(binary_file) is64bit = arch.endswith("64") # Make sure we have the linker ensure_linker(device, sysroot, is64bit) 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, binary_file=binary_file, is64bit=is64bit, port=args.port) # Find where gdb is if sys.platform.startswith("linux"): platform_name = "linux-x86" elif sys.platform.startswith("darwin"): platform_name = "darwin-x86" else: sys.exit("Unknown platform: {}".format(sys.platform)) gdb_path = os.path.join(root, "prebuilts", "gdb", platform_name, "bin", "gdb") # Print a newline to separate our messages from the GDB session. print("") # Start gdb. gdbrunner.start_gdb(gdb_path, gdb_commands)