Zir*_*Bai 5 c segmentation-fault
我是一个C假人,正在研究一个C项目,它要求我编写一个信号处理程序来捕获SIGSEGV信号并执行一些操作.
基本上,主程序将尝试访问既不可读也不可写的内存块.当主程序访问这块内存时,它将引发一个SIGSEGV信号,在我的信号处理函数中,我将捕获信号并使用mprotect()将该内存块转换为可读写.
但我不知道有没有办法得到信号被我的信号处理程序捕获时导致SIGSEGV的地址.如果我没有导致SIGSEGV的实际地址,我什么也做不了.并且我不允许从main获取地址到我的信号处理程序.
有人能帮我吗?谢谢!
至少在 Linux 上答案是肯定的。
您可以用来sigaction注册信号处理程序,然后设置标志SA_SIGINFO并设置sa_sigaction处理程序。
这使您可以访问siginfo_t(信号处理程序的第二个参数),其中(除其他外)包含一个void *si_addr;字段,该字段(对于SIGSEGV)包含错误地址。
#define _POSIX_C_SOURCE 199309L
#include <signal.h>
void my_handler(int sig, siginfo_t *info, void *ucontext) {
... info->si_addr ...
}
...
struct sigaction act = {0};
act.sa_sigaction = my_handler;
act.sa_flags = SA_SIGINFO;
sigaction(SIGSEGV, &act, NULL);
Run Code Online (Sandbox Code Playgroud)
man 2 sigaction详情请参阅。
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |