Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android是否支持PTRACE_单步?_Android_Linux_Ptrace - Fatal编程技术网

android是否支持PTRACE_单步?

android是否支持PTRACE_单步?,android,linux,ptrace,Android,Linux,Ptrace,好的,这是一个简单的问题。当我使用PTRACE系统调用时,android是否支持PTRACE_单步?当我想测试一个android apk程序时,我发现我无法处理单步跟踪。但是当我使用PTRACE_系统调用时,情况发生了变化,它可以完美地工作。安卓系统是否取消了这个功能,或者arm在硬件上缺乏一些支持?任何帮助都将不胜感激!谢谢 这是我的核心课程: int main(int argc, char *argv[]) { if(argc != 2) { __andr

好的,这是一个简单的问题。当我使用PTRACE系统调用时,android是否支持PTRACE_单步?当我想测试一个android apk程序时,我发现我无法处理单步跟踪。但是当我使用PTRACE_系统调用时,情况发生了变化,它可以完美地工作。安卓系统是否取消了这个功能,或者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,程序将得到一个错误

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

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

引用关于相同提交的邮件列表消息,描述旧情况:

PTRACE_SINGLESTEP是一个PTRACE请求,旨在提供单步执行 在底层架构具有硬件时支持用户空间 支持此操作

在ARM上,我们将
arch\u has\u single\u step()
设置为1并尝试进行仿真 硬件单步执行,将当前指令分解为 确定下一台pc并在其上放置软件断点 地点

不幸的是,这存在以下问题:

  • 仅支持ARMv7指令的一个子集
  • Thumb-2不受支持
  • 代码不是SMP安全的
  • 我们可以尝试修复此代码,但事实证明,由于 上述问题在实践中很少使用。例如,GDB使用 PTRACE_POKETEXT和PTRACE_peek text来管理断点本身和 不需要任何内核帮助

    此修补程序将从ptrace中删除单步模拟代码 PTU单步请求将在ARM上返回-EIO。便携式 代码必须检查ptrace调用的返回值并处理 失败是优雅的

    签字人:威尔·迪肯
    ---

    我收到的关于v1的评论表明:

    • 如果需要仿真,则可以从用户空间进行仿真
    • ltrace使用单步调用(有条件地在编译时使用),因为其他体系结构(如mips)不支持这种调用 请求),但不检查ptrace的返回值。这是一个 比赛中的虫子
    • strace不使用单步

    NVM,找到并修复了。2019年的现状是什么?@Cyker:AFAIK,还是不见了。大概在完全SMP安全的内核中没有干净的方法来实现这一点(您应该能够在不中断其他线程的情况下ptrace(ptrace_SINGLESTEP)一个线程),并且内核中有很多代码就是为了实现这一点。除非AArch64引入了新的硬件支持,否则仍将消失。最近的一份复制件证实了它在2020年末的32位Raspberry Pi上仍然不存在,使用的是IDK what软件版本。