我正在尝试运行会产生分段错误的代码。但是没有生成分段错误。
int main()
{
char *variable;
strcpy(variable,"hello");
}
程序崩溃但是没有显示发生分段违规的消息。
即使我编写一个信号处理程序来处理分段错误,信号也不会被捕获。
你知道为什么会这样吗?是否有可能内核对SIGSEGV信号的处理被禁用或者某些东西......
谢谢,
答案 0 :(得分:1)
在我的情况下,分段错误已经使用gcc编译器(输出:分段错误)。但是如果在你的情况下它不会出现,请尝试使用strace运行你的二进制文件。如strace ./a.out(say)。它将显示在控制台上执行的系统级命令。也许你会从这个
得到一个想法答案 1 :(得分:0)
首先,你真的应该养成用gcc -Wall
进行编译的习惯,警告这些错误。
要了解实际发生的情况,请使用gdb
等调试程序逐步运行代码。您也可以使用strace
或更好ltrace
(这将显示strcpy
的参数。)
然后,可能的解释(只是猜测)可能如下:
您的variable
未初始化
因此它保留了存储variable
之前的寄存器(或堆栈槽)的“值”
main
由crt0.o
调用,恰好用有意义的东西(有效指针)初始化该位置,可能是argv[0]
main
或某些shell环境变量
(您可以阅读有关x86-64 ABI的更多信息,了解crt0.o
如何设置堆栈)
如果您初始化variable=NULL;
,则会获得SIGSEGV