,大概是调用到了4,5次的时候把,这是子函数内部的写函数,我往文件fp里写,已经写完了,打算去关闭的时候出现的。而且fp的值是有的,很奇怪,望高手指点75 fclose(fp);(gdb) p fp$21 = (FILE *) 0x603fd0(gdb) p fclose(fp)Program received signal SIGSEGV, Segmentation fault.0x0000003a8b25ff39 in fclose@@GLIBC_2.2.5 () from /lib64/libc.so.6The program being debugged was signaled while in a function called from GDB.GDB remains in the frame where the signal was received.To change this behavior use "set unwindonsignal on".Evaluation of the expression containing the function(fclose@plt) will be abandoned.When the function is done executing, GDB will silently stop.
2 回答
![?](http://img1.sycdn.imooc.com/533e4bd900011a1d02000200-100-100.jpg)
慕运维8079593
TA贡献1876条经验 获得超5个赞
(gdb) p fp
$21 = (FILE *) 0x603fd0
首先.p fp打印的是文件指针.也就是fp的指针地址.而是文件指针的内容...
你应该使用 p *fp查看_fileno
如果不为-1.则文件是被打开的.
其实在fp前做个检查就好了 ...
if(fp) fclose(fp);
还有一种办法.如果你是LINUX的话.
在调试的时候.在fclose之前打上断点.运行到断点的时候ps看下程序的PID.去proc里看下文件是否已经被关闭了...
具体路径在/proc/PID/fd
ls -l一下.就可以看到打开了哪些文件.以及文件描述符.如果没有fopen打开的文件.就表示已经被关闭过了...
![?](http://img1.sycdn.imooc.com/5458478b0001f01502200220-100-100.jpg)
拉丁的传说
TA贡献1789条经验 获得超8个赞
SIGSEGV 信号表示你引用了一个无效的,或者非法的内存区域;
出现这个错误,肯定是你的 fp 指针无效,但不一定非法,所以 fclose 报错;
你要保证你的文件打开成功,并且 fp 持有一个合法的文件指针,才能用 fclose 关闭文件;
- 2 回答
- 0 关注
- 94 浏览
添加回答
举报
0/150
提交
取消