【发布时间】:2015-03-01 18:12:18
【问题描述】:
我正在尝试为 Android 创建一个监控应用程序作为项目的一部分。为此,我想使用 strace,但我无法让 Strace 在真实设备上工作。
为了测试 Strace,最初我尝试使用 Adb 启动 Strace,代码如下:
adb 外壳
root@mako:/ # strace -p 9807
Strace 正确启动,但是(据我所知)每当用户输入应用程序时,它都会提供以下输出,当 Strace 退出时,它跟踪的应用程序会自行重新启动:
clock_gettime(CLOCK_MONOTONIC, {68514, 862578038}) = 0
clock_gettime(CLOCK_MONOTONIC, {68514, 862822201}) = 0
clock_gettime(CLOCK_MONOTONIC, {68514, 863035844}) = 0
clock_gettime(CLOCK_MONOTONIC, {68514, 863249487}) = 0
clock_gettime(CLOCK_MONOTONIC, {68514, 863463129}) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0xd} ---
sigaction(SIGSEGV, {SIG_DFL, [], SA_RESTART}, {0xb520a3b9, [], SA_STACK|SA_SIGINFO}, 0) = 0
sigaction(SIGHUP, {0xb520a3b9, [], SA_STACK|SA_SIGINFO}, NULL, 0) = 0
prctl(PR_GET_NAME, 0xb6fcbb6c, 0, 0, 0) = 0
socket(PF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 31
fcntl64(31, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
connect(31, {sa_family=AF_LOCAL, sun_path="/dev/socket/logdw"}, 110) = 0
clock_gettime(CLOCK_REALTIME, {1420310998, 749300862}) = 0
writev(1, [{"\4", 1}, {"\365%", 2}, {"\3269\250T~l\251,", 8}, {"\7", 1 }, {"libc\0", 5}, {"致命信号 1 (???), code 1 in "..., 59}], 6) = 76
关闭(1) = 0
prctl(PR_GET_DUMPABLE) = 1
socket(PF_LOCAL, SOCK_STREAM, 0) = 1
connect(1, {sa_family=AF_LOCAL, sun_path=@"android:debuggerd"}, 20) = 0
写(1, "\0\0\0\0\365%\0\0\0\0\0\0\1\0\0\0", 16) = 16
读取(1, "", 1) = 0
关闭(1) = 0
sigaction(SIGHUP, {SIG_DFL, [], SA_RESTART}, {0xb520a3b9, [], SA_STACK|SA_SIGINFO}, 0) = 0
rt_sigreturn() = 1545157337
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0xd} ---
+++ 被 SIGSEGV +++ 杀死
当我在模拟器上尝试同样的事情时,它工作正常。
我的设备已植根,我相信我向 adb 授予了必要的权限(SuperSU 要求授予 SuperUser 权限,shell 是 root@mako)。我还下载了一个 strace 二进制文件,将其推送到设备并尝试通过在应用中打开来跟踪它(通过尝试跟踪打开 Strace 的同一个应用),但它也给出了类似的行为。
我在启用 Usb 调试和打开 Eclipse 并且没有进行 Usb 调试的情况下都尝试了这个。当 Eclipse 打开时,在应用程序崩溃之前,Logcat 会给出以下日志:
01-03 21:15:13.936: E/(11338): ptrace attach failed: 不允许操作
这让我认为这是一个权限问题,但它也令人困惑,因为 strace 在给出用户输入之前一直有效。
所以现在我很困惑为什么 Strace 不能在我的设备上运行。任何帮助或指向正确方向的指针表示赞赏。
编辑:我使用的是 Android 5.0.1,这可能是也可能不是问题,因为我在某处读到由于安全性改进,在 Kitkat 之后 ptrace 存在一些问题,但我再次不确定这是否是问题。任何确认/解决方案都是完美的。
【问题讨论】:
-
您的 strace 可能与您的设备有细微的不兼容或有细微的损坏。在多线程环境中工作尤其棘手。您可以改用 ndk gdb/gdbserver 吗?你到底想完成什么?
-
我可以理解我推送到设备的二进制 strace 不兼容或已损坏,但 adb 的 Strace 的行为方式也与我怀疑已损坏的方式相同。也许当我扎根时,我的设备可能出现了问题(尽管这是一个非常干净的进度..)我正在尝试创建一个应用程序来监视其他应用程序进行的系统调用,以检测学期项目的可疑行为。我在想 strace 是一个完美的工具。我去看看gbdserver,谢谢!
-
adb 没有 systrace,它只是一个接口。我不知道现有的 Android 是否在您的版本中提供了一个,但即使“官方”作为不经常使用的代码,它也可能是陈旧/不可行的。理解 ptrace 拒绝可能是关键:其他人已经这样做了?错误的用户? Selinux?打错电话了?
标签: android android-emulator adb segmentation-fault strace