为了账号安全,请及时绑定邮箱和手机立即绑定

下面是我的调试结果,之前一直没有错,后面有问题,为什么?

下面是我的调试结果,之前一直没有错,后面有问题,为什么?

C
函数式编程 2022-07-14 18:11:02
,大概是调用到了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 回答

?
慕运维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打开的文件.就表示已经被关闭过了...

查看完整回答
反对 回复 2022-07-18
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

SIGSEGV 信号表示你引用了一个无效的,或者非法的内存区域;
出现这个错误,肯定是你的 fp 指针无效,但不一定非法,所以 fclose 报错;
你要保证你的文件打开成功,并且 fp 持有一个合法的文件指针,才能用 fclose 关闭文件;

查看完整回答
反对 回复 2022-07-18
  • 2 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信