我对能够识别出问题所在指令地址的信号处理程序很感兴趣。
我了解 siginfo_t
和 __builtin_return_address
,但似乎都无法实现:
#include <iostream>
#include <signal.h>
void handler (int, siginfo_t *, void *);
int main ()
{
begin:
std :: cerr << &&begin << " ~ " << &&before << " ~ " << &&after << "\n";
struct sigaction s;
s .sa_flags = SA_SIGINFO;
sigemptyset (& s .sa_mask);
s .sa_sigaction = handler;
sigaction (SIGSEGV, &s, NULL);
int * i = NULL;
before:
*i = 0;
after:
std :: cout << "End.\n";
}
void handler (int, siginfo_t *si, void *)
{
std :: cerr << "si:" << si -> si_addr << "\n";
std :: cerr << "At: " << __builtin_return_address (0) << "\n";
std :: cerr << "At: " << __builtin_return_address (1) << "\n";
std :: cerr << "At: " << __builtin_return_address (2) << "\n";
std :: cerr << "At: " << __builtin_return_address (3) << "\n";
std :: cerr << "At: " << __builtin_return_address (4) << "\n";
std :: cerr << "At: " << __builtin_return_address (5) << "\n";
}
这将输出类似于以下内容:
0x10978 ~ 0x10a4c ~ 0x10a54
si:0
At: 0xfb945364
At: 0xfb939e64
At: 0x10a40
At: 0x10740
At: 0
At: Segmentation Fault
所以,siginfo_t
是NULL,而__builtin_return_address
在命名标签之间产生值。
我原本期望这两个函数都返回&&before
的值。我是否正确使用了这些函数?
在Linux 2.6.9-89.0.9.Elsmp和SunOS上进行了测试。
sigaction
和SA_SIGINFO
,以及siginfo_t
),内核需要保护免受欺骗。在siginfo_t
中有一个字段指示了信号的来源,而sigqueue
无法伪造信号源作为内核。 - R.. GitHub STOP HELPING ICE