c++ - 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。非常感谢您。
解决方案
推荐阅读
- java - 在java中隐藏Kotlin运算符重载函数
- elasticsearch - Filebeat“名称:”来自文件
- kentico - 如何安排电子邮件通讯
- android - 应用程序 UI 未从高速套接字接收所有数据
- vue.js - 使用 Vuelidate 从父组件验证子组件中的表单输入字段
- php - php-amqplib/rabbitmq-bundle 消费者不要关闭
- android - 如何计算firebase实时数据库中子节点内的值的总和?
- perl - 在 /root/perl5/lib/perl5/Parallel/ForkManager.pm 第 73 行的模式匹配 (m//) 中使用未初始化的值 $args[0]
- jmeter - 无法定位元素:{"method":"xpath","selector":"//button[contains(text(),'New patient')]"}
- python - Pandas: Plot a histogram of times in intervals of 10 minutes