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