我正在测试macos下的信号系统。这是我的测试代码:
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
struct itimerval timeout={0};
static void handle_prof_signal(int sig_no, siginfo_t* info, void *vcontext)
{
char output[100];
ucontext_t *context = (ucontext_t*)vcontext;
size_t pc = context->uc_mcontext->__ss.__rip;
snprintf(output,100,"Sample at %zx\n",pc);
// write(1,output,strlen(output)+1);
printf("%s", output);
setitimer(ITIMER_PROF, &timeout, 0);
}
int main()
{
struct sigaction sig_action;
memset(&sig_action, 0, sizeof(sig_action));
sig_action.sa_sigaction = handle_prof_signal;
sig_action.sa_flags = SA_RESTART | SA_SIGINFO;
sigemptyset(&sig_action.sa_mask);
sigaction(SIGPROF, &sig_action, 0);
timeout.it_value.tv_sec=1;
setitimer(ITIMER_PROF, &timeout, 0);
volatile int i=0;
do
{
++i;
} while(1);
return 0;
}
我创建了一个简单的macos命令行项目。当我在handle_prof_signal中放置一个断点时,它会在我运行这个项目时暂停。
printf函数将在控制台上输出rip寄存器的值。
但是当我点击stacktrace视图上的函数,并在调试视图中检查实时寄存器值时,rip寄存器的值不等于uc_mcontext->__ss。__rip。
实时rip寄存器的值总是__ss。我想知道这是为什么。
为什么?
您可以看到地址0x0000000100003e3e在这个应用程序中不存在。
非常感谢。