堆栈在Linux上使用ptrace

以下是我的要求。

而进程A正在运行。

  1. 使用PTRACE_ATTACH从B附加进程A.
  2. 开始一个循环
  3. 停止进程A
  4. 读取寄存器
  5. 恢复过程A
  6. hibernate状态(1)
  7. 结束循环
  8. 分离A

我面临的问题与循环启动和恢复过程A. 我尝试组合kill(pid,SIGSTOP),kill(pid,SIGCONT),PTRACE_CONT。 但没有工作。

任何其他解决scheme,请

提前致谢。 桑迪普

以下代码正在为我工​​作,似乎满足您的要求 –

AC

#include<stdio.h> int main() { int i=0; printf("My PID is - %ld\n",getpid()); while(i>=0) { } return 0; } 

BC – 追踪过程

 int main() { int pid; int status; struct user_regs_struct regs; unsigned int eip; printf("Enter pid to trace : \n"); scanf("%d",&pid); printf("PID to be traced - %ld\n",pid); ptrace(PTRACE_ATTACH,pid,0,0); if(errno) { perror("attach"); return -1; } waitpid(pid,&status,WUNTRACED); printf("Process Stopped\n"); while(1) { ptrace(PTRACE_GETREGS,pid,0,&regs); eip=ptrace(PTRACE_PEEKTEXT,pid,regs.eip,0); printf("EIP - 0x%08x, instruction executed - 0x%08x\n",regs.eip,eip); ptrace(PTRACE_CONT,pid,0,0); waitpid(pid,&status,WUNTRACED); } return 0; } 

信号通过 –

杀-STOP 17779杀-STOP 17779

A –

 xxxxx!xxxxx:~/myPer/stack_overflow [135]$ ./A My PID is - 17779 

B –

 XXXXX!xxxxx:~/myPer/stack_overflow [121]$ ./B Enter pid to trace : 17779 PID to be traced - 17779 Process Stopped EIP - 0x080483e1, instruction executed - 0x00f87d83 EIP - 0x080483e5, instruction executed - 0x00b8fa79 EIP - 0x080483e5, instruction executed - 0x00b8fa79 

我们看到B显示传送给客户端的每个信号的EIP值。 基本上信号没有传递给A,而是B唤醒并检查EIP,然后继续循环。 如果需要,您可以修改代码来传递信号。

这是我从你的问题中了解到的。 如果我了解其他的东西,请让我知道,我会相应地更新答案

听起来像是一个非常具有挑战性的项目,从头开始。 你有没有考虑过以任何方式利用GNU调试器 ? 特别是有一个叫做libgdb2的长期运行的子项目,它可能适合你的目的,即使目前还没有完成或稳定。

您可以尝试使用gdb的脚本/接口,就像很多IDE所做的一样。 另见http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/gdb/gdb-mi.html