【问题标题】:Does android support the PTRACE_SINGLESTEP?android 是否支持 PTRACE_SINGLESTEP?
【发布时间】:2014-04-14 10:40:44
【问题描述】:

好的,这是一个简单的问题。当我使用 ptrace 系统调用时,android 是否支持 PTRACE_SINGLESTEP?当我想 ptrace 一个 android apk 程序时,我发现我无法处理 SINGLESTEP 跟踪。但是当我使用 PTRACE_SYSCALL 时情况发生了变化,它可以完美地工作。 android是不是淘汰了这个功能或者arm在硬件上缺少一些支持?任何帮助将不胜感激!谢谢。

这是我的核心程序:

    int main(int argc, char *argv[])
   {   
    if(argc != 2) {
    __android_log_print(ANDROID_LOG_DEBUG,TAG,"please input the pid!");
      return -1;
    }
    if(0 != ptrace(PTRACE_ATTACH, target_pid, NULL, NULL))
   {
    __android_log_print(ANDROID_LOG_DEBUG,TAG,"ptrace attach error");
    return -1;
   }
    __android_log_print(ANDROID_LOG_DEBUG,TAG,"start  monitor process     :%d",target_pid);
    while(1)
    {
    wait(&status);
    if(WIFEXITED(status))
    {
        break;
    }
if (ptrace(PTRACE_SINGLESTEP, target_pid, 0, 0) != 0)
__android_log_print(ANDROID_LOG_DEBUG,TAG,"PTRACE_SINGLESTEP attach error");
    }
ptrace(PTRACE_DETACH, target_pid, NULL, NULL);
__android_log_print(ANDROID_LOG_DEBUG,TAG,"monitor finished");   
return 0; 
    }

我在 shell 上运行这个程序。而且我可以获得root权限。 如果我将请求更改为 PTRACE_SYSCALL 程序将正常运行。 但是如果请求是PTRACE_SINGLESTEP,程序就会报错!

【问题讨论】:

    标签: android linux ptrace


    【解决方案1】:

    自 2011 年以来,ARM Linux 上的 PTRACE_SINGLESTEP 已被 this commit 删除。

    硬件不支持单步;以前的内核支持涉及对指令进行解码以找出下一个(分支)并用调试中断软件断点临时替换它。

    引用关于同一提交的邮件列表消息,描述旧情况:http://lists.infradead.org/pipermail/linux-arm-kernel/2011-February/041324.html

    PTRACE_SINGLESTEP 是一个 ptrace 请求,旨在提供单步执行 当底层架构有硬件时对用户空间的支持 支持这个操作。

    在 ARM 上,我们将 arch_has_single_step() 设置为 1 并尝试模拟 硬件单步通过反汇编当前指令来 确定下一台电脑并在其上放置软件断点 位置。

    不幸的是,这有以下问题:

    1. 仅支持 ARMv7 指令的子集
    2. Thumb-2 不受支持
    3. 代码不是 SMP 安全的

    我们可以尝试修复此代码,但事实证明,由于 以上问题在实践中很少使用。例如,GDB 使用 PTRACE_POKETEXT 和 PTRACE_PEEKTEXT 管理断点本身和 不需要任何内核帮助。

    此补丁从 ptrace 含义中删除了单步仿真代码 PTRACE_SINGLESTEP 请求将在 ARM 上返回 -EIO。便携的 代码必须检查 ptrace 调用的返回值并处理 优雅地失败。

    签字人:Will Deacon
    ---

    我收到的关于 v1 的 cmets 表明:

    • 如果需要仿真,可以从用户空间进行仿真
    • ltrace 使用 SINGLESTEP 调用(在编译时有条件,因为其他体系结构,例如 mips,不支持此 request) 但不检查 ptrace 的返回值。这是一个 ltrace 中的错误。
    • strace 不使用 SINGLESTEP

    【讨论】:

    • NVM,找到并修复。
    • 2019年的现状如何?
    • @Cyker:AFAIK,还是没了。大概没有干净的方法可以在完全 SMP 安全的内核中执行此操作(您应该能够在不中断其他线程的情况下 ptrace(PTRACE_SINGLESTEP) 一个线程),而且内核中有很多代码只是为了这个.除非 AArch64 引入了新的硬件支持,否则仍然没有。最近重复的Troubles at singlestepping on ARM machine 确认它在 2020 年末仍然不存在于 32 位 Raspberry Pi 上,使用 IDK 什么软件版本。
    猜你喜欢
    • 2010-12-16
    • 2015-01-03
    • 2018-03-26
    • 2016-12-15
    • 1970-01-01
    • 2013-05-10
    • 2012-03-17
    • 2013-01-03
    • 2015-12-16
    相关资源
    最近更新 更多