使用ptrace时,attach的子进程钟代码执行的有点懵逼

IT保安 2017-03-31 05:32:02
刚刚接触ptrace,百度了一些资料,主要是写个测试代码,自己将代码敲了出来,然后在虚拟机里慢慢玩。

主要问题是:
1.既然子进程里调用execl会令内核挂起子进程,并通知调试进程,那么调试进程在干完活之后,放开对子进程的控制。按我的理解,此时子进程的代码流程就应该由被挂起的execl开始向下继续执行。

可是我在控制台中看到了由execl函数执行的"ls"命令的输出,却无法看见printf的输出,也就说明了子进程此时应该是挂起的哦,只有在控制台中手动输入ctrl+c结束掉进程。

这就有点不理解啊,为何子进程没有按代码流程向下执行呢?求解答


#include <stdio.h>
#include <unistd.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/user.h>
#include <sys/syscall.h>
#include <time.h>
#include <string.h>


int main()
{
pid_t pidChild = 0;
long orig_rax;
int status;
int iscalling = 0;
struct user_regs_struct Regs;

pidChild = fork();

if(pidChild == 0)
{
ptrace(PTRACE_TRACEME,0,NULL,NULL);

execl("/bin/ls","ls",NULL);
printf("child exit!\r\n"); //

}else if(pidChild != -1) //parent
{
wait(&status);
if(WIFEXITED(status))
{
return 0;
}

/* ptrace(PTRACE_GETREGS,pidChild,NULL,®s);
printf("EAX == %llx,EBX == %llx,ECX == %llx,ESP == %llx\r\n",Regs.rax,Regs.rbx,Regs.rcx,Regs.rsp);
ptrace(PTRACE_CONT,pidChild,NULL,NULL);*/

ptrace(PTRACE_DETACH,pidChild,NULL,NULL);
sleep(4); //wait 4 secs,let son_process run
}
printf("exit!\r\n");
return 0;
}
...全文
298 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,216

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧