我需要拦截和跟踪来自任何二进制文件的信号,就像 strace 在 linux 下一样。我不需要像真正的 strace 那样冗长的输出。我只想知道它是如何工作的,如何截获信号以及如何跟踪它们。提前致谢 :)
问问题
6641 次
3 回答
4
strace 使用ptrace()
系统调用进行跟踪,它还允许您拦截(并可能操纵)发送到进程的信号。
这是一个小例子:
#include <sys/ptrace.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
/* simple example, child is traced, uses alarm which causes a signal to be
* set up */
pid_t child;
child = fork();
if (child == 0)
{
ptrace(PTRACE_TRACEME, 0, NULL, NULL);
alarm(3);
while(1)
{
}
exit(0);
}
/* parent */
while(1)
{
int wstatus;
int signum;
wait(&wstatus);
if (WIFEXITED(wstatus) || WIFSIGNALED(wstatus))
break;
signum = WSTOPSIG(wstatus);
printf("child stopped with signal %d\n", signum);
/* resume execution */
ptrace(PTRACE_CONT, child, NULL, signum);
}
return 0;
}
于 2009-12-20T12:07:08.140 回答
3
这是一个简单的实现:
int main()
把你的几个电话放在某个地方signal()
,一个你想捕捉的信号。第一个参数是信号名称;第二个是信号处理函数(更多内容见下文):
signal(SIGFPE, SignalHandler);
signal(SIGILL, SignalHandler);
signal(SIGINT, SignalHandler);
signal(SIGSEGV, SignalHandler);
signal(SIGTERM, SignalHandler);
#ifndef WIN32
signal(SIGHUP, SignalHandler);
signal(SIGQUIT, SignalHandler);
signal(SIGKILL, SignalHandler);
signal(SIGPIPE, SignalHandler);
signal(SIGCHLD, SignalHandler);
#endif
现在,编写一个信号函数。它必须返回 void 并接受一个 int: void SignalHandler(int signal_number)
:
void SignalHandler(int signal_number)
{
printf("Received signal: %s\n", strsignal(signal_number);
// Do something
}
而已!您也可以通过使用该功能向自己发送信号来测试它raise(SIGNAL_NAME)
;例如,试试raise(SIGTERM);
!
于 2009-12-20T12:11:06.513 回答
0
除了调试它们之外,您不应该出于任何原因拦截其他进程的信号。这就是 strace 的用途。进程应该能够处理它们自己的信号。
不用说,如果您正在编写调试器,请了解 ptrace()。
于 2009-12-20T12:14:42.437 回答