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
或某个shell环境变量argv[0]
crt0.o
如何设置堆栈的内容)
如果初始化
变量=NULL
您将获得一个SIGSEGV
如果您没有得到任何SIGSEGV
则表示您的程序没有崩溃。变量中的垃圾值可能指向某个可写的地方,并且不会损坏堆栈,因此程序运行时不会崩溃。