【问题标题】:Running Strace on Real Android Device gives SIGSEGV在真正的 Android 设备上运行 Strace 会产生 SIGSEGV
【发布时间】: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


【解决方案1】:

我的 nexus4 运行 cm-12.1 时遇到了同样的错误。

adb shell
root@mako:/ # strace -p pid
...
something
...
+++ killed by SIGSEGV +++

大多数情况下,当我尝试使用被追踪的应用程序时。错误出现了。

然后我尝试了 另一个 rom,并且 strace 有效。 :)

您的 strace 可能与您的设备略有不兼容,或者正如 Chris Stratton 所说的那样被巧妙地破坏了。

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多