这就是 strace 派上用场的地方。如果我使您的程序可编译并编译它:
$cat trap.c
#include <signal.h>
void sigtrap_func(int sig) { puts("trap"); }
int main()
{
signal(SIGTRAP, sigtrap_func);
}
$ cc -o trap trap.c
然后用 运行它strace,我会得到程序执行的所有系统调用的列表:
$strace -i ./trap
[ 31076ad057] execve("./trap", ["./trap"], [/* 32 vars */]) = 0
... stuff omitted that loads dynamic libraries
[ 3107632abe] rt_sigaction(SIGTRAP, {0x400504, [TRAP], SA_RESTORER|SA_RESTART, 0x31076329a0}, {SIG_DFL, [], 0}, 8) = 0
[ 31076ad038] exit_group(0) = ?
您会看到rt_sigaction(实现 的系统调用signal())在 处被调用0x3107632abe,并将处理程序函数设置为0x31076329a0。现在是开始的时候了gdb,并在那里设置断点(尽管要小心 ASLR!)。