2013-04-20 37 views
1

我正在为我的大学课堂构建一个简单的调试器,并且在处理SIGINT时遇到了问题。为什么SIGINT发送给子进程并且什么都不做?

我想要做的是当调试器进程(从现在开始PDB)接收到一个SIGINT信号并将其传递给子进程(实际上由PDB进行调试的进程)。

我这样做:

pid_t childid; 

void catch_sigint(int sig) 
{ 
    signal(SIGINT,SIG_DFL); 
    kill(childid,sig); 
} 

int debuger (char *address, parm *vars) 
{ 
    int ignore=1; 
    int status; 

    childid = fork(); 
    signal(SIGINT,catch_sigint); 
    if(childid==0) 
    { 
     ptrace(PTRACE_TRACEME,0, NULL,NULL); 
     if(execve(address,NULL,NULL)==-1) 
     { 
      perror("ERROR occured when trying to create program to trace\n"); 
      exit(1); 
     } 
    } 
    else 
    { 
     int f_time=1; 

     while(1) 
     { 
      long system_call; 

      wait(&status); 
      if(WIFEXITED(status))break; 
      if(WIFSIGNALED(status))break; 

      system_call = ptrace(PTRACE_PEEKUSER,childid, 4 * ORIG_EAX, NULL); 

      if(!strcmp(vars->category,"process-control") || !strcmp(vars->category,"all"))  
       ignore = pr_calls(system_call,ignore,limit,childid,vars->mode); //function that takes the system call that is made and prints info about it 
      if(!strcmp(vars->category,"file-management") || !strcmp(vars->category,"all")) 
       ignore = fl_calls(system_call,ignore,limit,childid,vars->mode); 

      if(f_time){ignore=1;f_time=0;} 
      ptrace(PTRACE_SYSCALL,childid, NULL, NULL); 
     }   
    } 
    signal(SIGINT,SIG_DFL); 
    return 0; 
} 

的运行程序和fork一个子进程和exec一个程序来跟踪它的系统调用。当它没有得到任何信号时,它工作正常。

但是当在一些跟踪的中间我按ctrl + c我期望子进程停止,并且PDB继续并停止(因为这条线if(WIFSIGNALED(status))break;。这从来没有发生过。它跟踪它的程序继续它的系统调用。和打印

的追踪程序是:

#include <stdio.h> 

int main(void) 
{ 
    for(;;) printf("HELLO WORLD\n");   
    return 0; 
} 

该方案继续打印HELLO WORLD我打了CTRL + C即使

我还观察到,系统调用的ptrace℃之后给出。 trl + c是-38,并且在等待状态从1407(我认为是正常值)到639的信号只改变一次,然后在下一次等待时再次回到1407。

那么我在做什么错?

回答

0

这是该行的问题:

ptrace(PTRACE_SYSCALL,childid, NULL, NULL); 

它必须是这样的:

ptrace(PTRACE_SYSCALL,childid, NULL, signal_variable); 

signal_variable是在全球范围内宣布这样的处理程序和调试器可以看到它的int 。它的起始值为0.

信号处理程序现在接收信号并将其传递到此变量中,并在下一个循环时,当ptrace命令tracee程序继续向它发送信号时。 发生这种情况的原因是,当你跟踪一个程序时,tracee在它接收到一个信号时停止执行,并等待进一步的指令来处理通过ptrace来自跟踪器的信号。