def get_gdbserver_path(args, package_name, app_data_dir, arch): app_gdbserver_path = "{}/lib/gdbserver".format(app_data_dir) cmd = ["ls", app_gdbserver_path, "2>/dev/null"] cmd = gdbrunner.get_run_as_cmd(package_name, cmd) (rc, _, _) = args.device.shell_nocheck(cmd) if rc == 0: log("Found app gdbserver: {}".format(app_gdbserver_path)) return app_gdbserver_path # We need to upload our gdbserver log("App gdbserver not found at {}, uploading.".format(app_gdbserver_path)) local_path = "{}/prebuilt/android-{}/gdbserver/gdbserver" local_path = local_path.format(NDK_PATH, arch) remote_path = "/data/local/tmp/{}-gdbserver".format(arch) args.device.push(local_path, remote_path) # Copy gdbserver into the data directory on M+, because selinux prevents # execution of binaries directly from /data/local/tmp. if get_api_level(args.props) >= 23: destination = "{}/{}-gdbserver".format(app_data_dir, arch) log("Copying gdbserver to {}.".format(destination)) cmd = ["cat", remote_path, "|", "run-as", package_name, "sh", "-c", "'cat > {}'".format(destination)] (rc, _, _) = args.device.shell_nocheck(cmd) if rc != 0: error("Failed to copy gdbserver to {}.".format(destination)) (rc, _, _) = args.device.shell_nocheck(["run-as", package_name, "chmod", "700", destination]) if rc != 0: error("Failed to chmod gdbserver at {}.".format(destination)) remote_path = destination log("Uploaded gdbserver to {}".format(remote_path)) return remote_path
def get_app_data_dir(args, package_name): cmd = ["/system/bin/sh", "-c", "pwd", "2>/dev/null"] cmd = gdbrunner.get_run_as_cmd(package_name, cmd) (rc, stdout, _) = args.device.shell_nocheck(cmd) if rc != 0: error("Could not find application's data directory. Are you sure that " "the application is installed and debuggable?") data_dir = stdout.strip() log("Found application data directory: {}".format(data_dir)) return data_dir
def get_app_data_dir(args, package_name): cmd = ["/system/bin/sh", "-c", "pwd", "2>/dev/null"] cmd = gdbrunner.get_run_as_cmd(package_name, cmd) (rc, stdout, _) = args.device.shell_nocheck(cmd) if rc != 0: error("Could not find application's data directory. Are you sure that " "the application is installed and debuggable?") data_dir = stdout.strip() log("Found application data directory: {}".format(data_dir)) return data_dir
def get_app_data_dir(args, package_name): cmd = ["/system/bin/sh", "-c", "pwd", "2>/dev/null"] cmd = gdbrunner.get_run_as_cmd(package_name, cmd) (rc, stdout, _) = args.device.shell_nocheck(cmd) if rc != 0: error("Could not find application's data directory. Are you sure that " "the application is installed and debuggable?") data_dir = stdout.strip() # Applications with minSdkVersion >= 24 will have their data directories # created with rwx------ permissions, preventing adbd from forwarding to # the gdbserver socket. To be safe, if we're on a device >= 24, always # chmod the directory. if get_api_level(args.props) >= 24: chmod_cmd = ["/system/bin/chmod", "a+x", data_dir] chmod_cmd = gdbrunner.get_run_as_cmd(package_name, chmod_cmd) (rc, _, _) = args.device.shell_nocheck(chmod_cmd) if rc != 0: error("Failed to make application data directory world executable") log("Found application data directory: {}".format(data_dir)) return data_dir
def get_gdbserver_path(args, package_name, app_data_dir, arch): app_gdbserver_path = "{}/lib/gdbserver".format(app_data_dir) cmd = ["ls", app_gdbserver_path, "2>/dev/null"] cmd = gdbrunner.get_run_as_cmd(package_name, cmd) (rc, _, _) = args.device.shell_nocheck(cmd) if rc == 0: log("Found app gdbserver: {}".format(app_gdbserver_path)) return app_gdbserver_path # We need to upload our gdbserver log("App gdbserver not found at {}, uploading.".format(app_gdbserver_path)) local_path = "{}/prebuilt/android-{}/gdbserver/gdbserver" local_path = local_path.format(NDK_PATH, arch) remote_path = "/data/local/tmp/{}-gdbserver".format(arch) args.device.push(local_path, remote_path) # Copy gdbserver into the data directory on M+, because selinux prevents # execution of binaries directly from /data/local/tmp. if get_api_level(args.props) >= 23: destination = "{}/{}-gdbserver".format(app_data_dir, arch) log("Copying gdbserver to {}.".format(destination)) cmd = [ "cat", remote_path, "|", "run-as", package_name, "sh", "-c", "'cat > {}'".format(destination) ] (rc, _, _) = args.device.shell_nocheck(cmd) if rc != 0: error("Failed to copy gdbserver to {}.".format(destination)) (rc, _, _) = args.device.shell_nocheck( ["run-as", package_name, "chmod", "700", destination]) if rc != 0: error("Failed to chmod gdbserver at {}.".format(destination)) remote_path = destination log("Uploaded gdbserver to {}".format(remote_path)) return remote_path