在崩溃期间没有捕获SIGSEGV信号

时间:2012-07-20 04:52:02

标签: c linux segmentation-fault

我正在尝试运行会产生分段错误的代码。但是没有生成分段错误。

int main()
{

char *variable;

strcpy(variable,"hello");

}

程序崩溃但是没有显示发生分段违规的消息。

即使我编写一个信号处理程序来处理分段错误,信号也不会被捕获。

你知道为什么会这样吗?是否有可能内核对SIGSEGV信号的处理被禁用或者某些东西......

谢谢,

2 个答案:

答案 0 :(得分:1)

在我的情况下,分段错误已经使用gcc编译器(输出:分段错误)。但是如果在你的情况下它不会出现,请尝试使用strace运行你的二进制文件。如strace ./a.out(say)。它将显示在控制台上执行的系统级命令。也许你会从这个

得到一个想法

答案 1 :(得分:0)

首先,你真的应该养成用gcc -Wall进行编译的习惯,警告这些错误。

要了解实际发生的情况,请使用gdb等调试程序逐步运行代码。您也可以使用strace或更好ltrace(这将显示strcpy的参数。)

然后,可能的解释(只是猜测)可能如下:

  • 您的variable未初始化

  • 因此它保留了存储variable之前的寄存器(或堆栈槽)的“值”

  • maincrt0.o调用,恰好用有意义的东西(有效指针)初始化该位置,可能是argv[0] main或某些shell环境变量

(您可以阅读有关x86-64 ABI的更多信息,了解crt0.o如何设置堆栈)

如果您初始化variable=NULL;,则会获得SIGSEGV