在macosx上的信号处理程序中的rip寄存器值

2022-01-30 07:04:06 标签 c++macosunixexceptionsignals

我正在测试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在这个应用程序中不存在。

非常感谢。

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码