【发布时间】:2020-03-16 06:37:05
【问题描述】:
我有时会看到它。但我不明白这个词的含义。
【问题讨论】:
-
您的进程被致命信号终止,并编写了一个进程内存映像以供(事后)调试器使用
-
当您在 Stack Overflow 上提问时,SO 会根据您的问题标题建议重复项。如果他们能回答你的问题,你至少应该随便看看这些。
我有时会看到它。但我不明白这个词的含义。
【问题讨论】:
当您试图访问无效地址时会发生这种情况。它可能看起来像这样:
int* a;
*a = 4;
或者这个:
struct s {
int a;
}
int main() {
struct s* foo;
foo->a = 4;
}
第一个示例中的变量a 和第二个示例中的foo 未初始化。他们不指向任何记忆。如果您尝试为其分配值,则会发生分段错误并且您的程序崩溃。
正确的做法是先初始化。
int* a = malloc(sizeof(int));
*a = 4;
// ...
free(a);
【讨论】:
Quoting维基百科,
在计算中,分段错误(通常缩写为 segfault)或访问冲突是由具有内存保护的硬件引发的故障或故障条件,通知操作系统 (OS) 软件已尝试访问受限区域内存(内存访问冲突)。
例如,以下将导致具有内存保护的机器(例如您现在正在使用的机器)出现分段错误:
char* s = NULL;
size_t len = 0;
for (size_t i=0; s[i]; ++i) { // SEGFAULT: s[i] tries to dereference a NULL
++len;
}
Quoting维基百科,
在计算中,核心转储、崩溃转储、内存转储或系统转储由计算机程序的工作内存在特定时间的记录状态组成,通常是在程序崩溃或以其他方式异常终止时。在实践中,通常会同时转储其他关键的程序状态,包括处理器寄存器,其中可能包括程序计数器和堆栈指针、内存管理信息以及其他处理器和操作系统标志和信息。
拥有核心转储允许调试较早崩溃的程序。请注意,除非启用设置,否则通常会跳过代码转储的实际创建(出于隐私、安全和空间原因)。
在 cmets 中讨论过说程序崩溃是否公平。
进程是接收 SIGSEGV 信号的对象,也是被转储的对象,因此可以说“进程崩溃”。
作为进程的驱动力,进程正在执行的指令可以说是导致崩溃的原因。这些指令的集合被称为“程序”,因此可以说“程序崩溃”。
两个表达式都是有效的,并且指向同一个事件。
【讨论】: