Unc*_*lan 3 c printf segmentation-fault
我正在用ncurses编写一个小型控制台游戏(作为一项学习任务),我已经遇到了一些小问题(这是我第一次在C中使用列表),但从来没有一个真正的showstopper.但是,作为"未来的供应",我想实现一个基本的调试日志文件.这就是事情开始表现得很奇怪的地方.
日志文件是全局声明的,fopen()(使用w +模式)和ferror()没有显示任何错误证据.相反,一切似乎完美无缺,创建了日志文件,信息被写入其中.但是,在我将一些调试输出添加到各种功能之后,游戏只是段错误.作为一个结果,我几乎将每个调试输出都注释掉了,现在这个简单的代码行崩溃了整个游戏:
fprintf(debuglog, "loop_game()\n\tTime's over! Returning 0\n");
Run Code Online (Sandbox Code Playgroud)
我使用gdb运行程序,并且bt full输出以下内容:
#0 0x00007ffff7886f24 in fwrite () from /lib/libc.so.6
No symbol table info available.
#1 0x000000000040224f in loop_game (pl=0x62d800, list_win=0x62f930,
timer=0x632620, list_ob=0x632640) at game.c:207
elapsed = 60
#2 0x0000000000402d53 in main () at main.c:62
pl = 0x62d800
list_win = 0x62f930
timer = 0x632620
list_ob = 0x632640
Run Code Online (Sandbox Code Playgroud)
(game.c:207是我之前提到的那条线)另外,有人告诉我应该使用watch debuglog,其输出如下:
Old value = (FILE *) 0x0
New value = (FILE *) 0x62f6f0
init () at console.c:128
128 fprintf(debuglog, "init()\n\tInitialised ncurses\n");
Run Code Online (Sandbox Code Playgroud)
然后我使用了继续,大约10秒后,它打印出这些行:
Old value = (FILE *) 0x62f6f0
New value = (FILE *) 0x20062f6f0
move_obstacle (win_game=0x62f970, target_ob=0x63ce00) at game.c:370
370 wrefresh(win_game);
Run Code Online (Sandbox Code Playgroud)
然后,在60秒后(这是游戏正常结束后的时间),游戏会出现段错误.有时当使用带有debuglog的 gdb 作为观察点时,它也会输出
Old value = (FILE *) 0x22f6f0
New value = (FILE *) 0x0
Run Code Online (Sandbox Code Playgroud)
或0x2而不是0x0.我甚至已经有了一个SIGABRT.
由于我是初学者,我不知道接下来该做什么.我已经问过一些肯定有广泛知识的人,但他们无法找到"万恶之源".如果您需要代码,可以在此处找到.我希望这只是我犯下的一个愚蠢的错误......
你可能正在写它.这就是我的意思.
在console.c,你有
int field[FIELDMAXX][FIELDMAXY];
FILE * debuglog;
Run Code Online (Sandbox Code Playgroud)
在debuglog你改变的那条线上:
field[target_ob->x_pos][target_ob->y_pos] = OBSTACLE; /* Changes debuglog. */
Run Code Online (Sandbox Code Playgroud)
所以它很可能是价值观,target_ob->x_pos而且target_ob->y_pos是你不期待的.
现在,你要做的第一件事是修复它(找出这些坐标会发生什么).您可以做的第二件事是定义一些其他的日志记录方式.我个人认为我会使用单独的日志记录功能(可以调用vfprintf),我会对debugfile某个文件进行静态处理.
| 归档时间: |
|
| 查看次数: |
1509 次 |
| 最近记录: |