首页 > 解决方案 > macosx 上信号处理程序中的 rip 寄存器值

问题描述

我在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 寄存器的值与 uc_mcontext->__ss.__rip 不相等。实时 rip 寄存器值总是 __ss.__rip + 1,我想知道这是什么原因。为什么?

你可以看到,这个应用程序中不存在地址 0x0000000100003e3e。非常感谢您。

在此处输入图像描述

标签: c++macosunixexceptionsignals

解决方案


推荐阅读