当前位置: 技术问答>linux和unix
Linux如何捕获栈溢出?
来源: 互联网 发布时间:2016-03-09
本文导语: void stack_overflow() { char buf[1024*1024]; stack_overflow(); return; } void handler(int signo) { printf("stack overflown"); } int main() { struct sigaction sa; sa.sa_handler = handler; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); ...
void stack_overflow()
{
char buf[1024*1024];
stack_overflow();
return;
}
void handler(int signo)
{
printf("stack overflown");
}
int main()
{
struct sigaction sa;
sa.sa_handler = handler;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGSEGV, &sa, NULL) == -1)
{
perror("can't install signal handlern");
}
stack_overflow();
return 0;
}
最后程序直接core dump,没有捕捉到栈溢出,为什么?
{
char buf[1024*1024];
stack_overflow();
return;
}
void handler(int signo)
{
printf("stack overflown");
}
int main()
{
struct sigaction sa;
sa.sa_handler = handler;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
if (sigaction(SIGSEGV, &sa, NULL) == -1)
{
perror("can't install signal handlern");
}
stack_overflow();
return 0;
}
最后程序直接core dump,没有捕捉到栈溢出,为什么?
|
在你的程序中,栈溢出是,SIGSEGV信号被捕获,但是执行信号句柄的过程,还需要压栈,才能执行。栈本身已经溢出了,再执行压栈操作,当然失败了
所以,如果需要捕获SIGSEGV信号的话,需要申请独立信号栈,使信号句柄的执行在独立的空间,已避免程序其他地方的错误影响到信号句柄的执行。
所以,如果需要捕获SIGSEGV信号的话,需要申请独立信号栈,使信号句柄的执行在独立的空间,已避免程序其他地方的错误影响到信号句柄的执行。