C 碰撞期间未捕捉到SIGSEGV信号

C 碰撞期间未捕捉到SIGSEGV信号,c,linux,segmentation-fault,C,Linux,Segmentation Fault,我正在尝试运行一个代码,它将生成一个分段错误。但是分割错误没有产生 int main() { char *variable; strcpy(variable,"hello"); } 程序崩溃,但未显示表示发生分段冲突的消息 即使我编写一个信号处理程序来处理分段错误,信号也不会被捕获 你知道为什么会这样吗?内核对SIGSEGV信号的处理是否有可能被禁用或其他什么 谢谢,在我的例子中,分段错误是使用gcc编译器产生的(输出:分段错误)。但是,如果在您的情况下,它不会出现,请尝试使用类似str

我正在尝试运行一个代码,它将生成一个分段错误。但是分割错误没有产生

int main()
{

char *variable;

strcpy(variable,"hello");

}
程序崩溃,但未显示表示发生分段冲突的消息

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

你知道为什么会这样吗?内核对SIGSEGV信号的处理是否有可能被禁用或其他什么


谢谢,

在我的例子中,分段错误是使用gcc编译器产生的(输出:分段错误)。但是,如果在您的情况下,它不会出现,请尝试使用类似strace的strace来运行二进制文件。/a.out(比如)。它将显示在控制台上执行的系统级命令。也许你会从中得到一个想法,首先,你真的应该养成用gcc-Wall编译的习惯,它警告你不要犯这样的错误

要了解真正发生的事情,请使用像
gdb
这样的调试器一步一步地运行代码。您还可以使用
strace
或更好的
ltrace
(这会将参数显示为
strcpy

那么,一个可能的解释(只是猜测)可能是:

  • 您的
    变量
    未初始化

  • 因此,它保留了存储
    变量的寄存器(或堆栈槽)以前拥有的“值”

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

(您可以阅读更多关于了解
crt0.o
如何设置堆栈的内容)


如果初始化
变量=NULL
您将获得一个
SIGSEGV

如果您没有得到任何
SIGSEGV
则表示您的程序没有崩溃。变量
中的垃圾值可能指向某个可写的地方,并且不会损坏堆栈,因此程序运行时不会崩溃。