我现在觉得很蠢,但是如何在GDB中解释这个消息?
Program received signal SIGSEGV, Segmentation fault.
0x00007fe2eb46073a in clearerr (fp=0x4359790) at clearerr.c:27
27 clearerr.c: No such file or directory.
in clearerr.c
导致段错误的文件丢失了什么?是clearerr.c还是更清晰者试图访问的文件?
答案 0 :(得分:1)
缺少导致段错误的文件?
我们不知道导致SIGSEGV
的原因,但任何丢失的文件都不太可能与它有任何关系。
首先,这个:
clearerr.c: No such file or directory.
只是意味着GDB无法向您显示发生SIGSEGV
的来源。这是因为clearerr()
是libc
的一部分,您要么没有为libc
安装源代码(它们甚至可能不适用于您的环境),要么您没有告诉GDB如何找到这些来源。
其次,SIGSEGV
的实际原因很可能是因为您调用它的fp
已损坏或以其他方式无效。
以下是一些可能发生的方法:
char c;
FILE *fp = (FILE*) &c; // fp is bogus: doesn't point to a FILE at all
clearerr(fp); // likely will crash
FILE *fp2; // fp2 contains uninitialized garbage
clearerr(fp2); // likely will crash
FILE *fp3 = fopen("/tmp/foo", "w");
fclose(fp3); // destroys fp3
clearerr(fp3); // accesses dangling memory, likely will crash
当然还有许多其他方式。您需要查看clearerr
的调用者以查看它是否正在做一些愚蠢的事情。要查找调用者,请使用GDB where
命令。
答案 1 :(得分:-2)
seg fault是由clearerr.c尝试访问的文件引起的(在第27行)。