android是否支持PTRACE_单步?
好的,这是一个简单的问题。当我使用PTRACE系统调用时,android是否支持PTRACE_单步?当我想测试一个android apk程序时,我发现我无法处理单步跟踪。但是当我使用PTRACE_系统调用时,情况发生了变化,它可以完美地工作。安卓系统是否取消了这个功能,或者arm在硬件上缺乏一些支持?任何帮助都将不胜感激!谢谢 这是我的核心课程: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
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并在其上放置软件断点
地点
不幸的是,这存在以下问题:
--- 我收到的关于v1的评论表明:
- 如果需要仿真,则可以从用户空间进行仿真
- ltrace使用单步调用(有条件地在编译时使用),因为其他体系结构(如mips)不支持这种调用 请求),但不检查ptrace的返回值。这是一个 比赛中的虫子
- strace不使用单步
NVM,找到并修复了。2019年的现状是什么?@Cyker:AFAIK,还是不见了。大概在完全SMP安全的内核中没有干净的方法来实现这一点(您应该能够在不中断其他线程的情况下ptrace(ptrace_SINGLESTEP)一个线程),并且内核中有很多代码就是为了实现这一点。除非AArch64引入了新的硬件支持,否则仍将消失。最近的一份复制件证实了它在2020年末的32位Raspberry Pi上仍然不存在,使用的是IDK what软件版本。