Auto merge of #21759 - jdm:ndkgdb, r=paulrouget

Add mach command to setup remote debugging on Android devices.

This removes any need to fiddle with search paths for source files and makes the experience of remote debugging much less frustrating. I've tried this on a Pixel, Pixel 2, and emulator and successfully set breakpoints and investigated variables on all of them. The APP_ABI changes are necessary to prevent ndk-gdb from thinking that the build is arm64 when it's not.

---
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21759)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2018-09-25 14:22:13 -04:00 committed by GitHub
commit 391d67fa1d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 59 additions and 2 deletions

View file

@ -8,10 +8,12 @@
# except according to those terms.
from __future__ import print_function, unicode_literals
from os import path, listdir
from os import path, listdir, getcwd
from time import time
import signal
import sys
import tempfile
import urllib2
import json
import subprocess
@ -265,3 +267,57 @@ class MachCommands(CommandBase):
"local",
self.config["android"]["lib"])
print(subprocess.check_output([ndk_stack, "-sym", sym_path, "-dump", logfile]))
@Command('ndk-gdb',
description='Invoke ndk-gdb tool with the expected symbol paths',
category='devenv')
@CommandArgument('--release', action='store_true', help="Use release build symbols")
@CommandArgument('--target', action='store', default="armv7-linux-androideabi",
help="Build target")
def ndk_gdb(self, release, target):
env = self.build_env(target)
self.handle_android_target(target)
ndk_gdb = path.join(env["ANDROID_NDK"], "ndk-gdb")
adb_path = path.join(env["ANDROID_SDK"], "platform-tools", "adb")
sym_paths = [
path.join(
getcwd(),
"target",
target,
"release" if release else "debug",
"apk",
"obj",
"local",
self.config["android"]["lib"]
),
path.join(
getcwd(),
"target",
target,
"release" if release else "debug",
"apk",
"libs",
self.config["android"]["lib"]
),
]
env["NDK_PROJECT_PATH"] = path.join(getcwd(), "support", "android", "apk")
signal.signal(signal.SIGINT, signal.SIG_IGN)
with tempfile.NamedTemporaryFile(delete=False) as f:
f.write('\n'.join([
"python",
"param = gdb.parameter('solib-search-path')",
"param += ':{}'".format(':'.join(sym_paths)),
"gdb.execute('set solib-search-path ' + param)",
"end",
]))
p = subprocess.Popen([
ndk_gdb,
"--adb", adb_path,
"--project", "support/android/apk/servoapp/src/main/",
"--launch", "com.mozilla.servo.MainActivity",
"-x", f.name,
"--verbose",
], env=env)
return p.wait()

View file

@ -1,4 +1,5 @@
NDK_TOOLCHAIN_VERSION := 4.9
NDK_TOOLCHAIN_VERSION := clang
APP_MODULES := c++_shared servojni gstreamer
APP_PLATFORM := android-18
APP_STL:= c++_shared
APP_ABI:= armeabi-v7a x86