,大概是調用到了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打開的文件.就表示已經被關閉過了...

拉丁的傳說
TA貢獻1789條經驗 獲得超8個贊
SIGSEGV 信號表示你引用了一個無效的,或者非法的內存區域;
出現這個錯誤,肯定是你的 fp 指針無效,但不一定非法,所以 fclose 報錯;
你要保證你的文件打開成功,并且 fp 持有一個合法的文件指針,才能用 fclose 關閉文件;
- 2 回答
- 0 關注
- 131 瀏覽
添加回答
舉報
0/150
提交
取消