我正在用 gdb 调试一个程序,但发生了一些我不明白的事情。
几个小时后正常工作,程序卡住了,gdb 显示以下信息。
(gdb) bt
#0 0xb7da8021 in write () from /lib/libc.so.6
#1 0xb7d5256f in _IO_file_write () from /lib/libc.so.6
#2 0xb7d52213 in ?? () from /lib/libc.so.6
#3 0xb7d524a6 in _IO_file_xsputn () from /lib/libc.so.6
#4 0xb7d2e31d in ?? () from /lib/libc.so.6
#5 0xb7d29b0e in vfprintf () from /lib/libc.so.6
#6 0xb7d3316f in fprintf () from /lib/libc.so.6
#7 0x080771b6 in print_screen (ws_row=63, ws_col=237, if_num=1) at server.c:8279
#8 0x0807196a in thread_one (arg=0x0) at server.c:5389
#9 0xb7e61f3b in start_thread () from /lib/libpthread.so.0
#10 0xb7db6d0e in clone () from /lib/libc.so.6
(gdb) frame 7
#7 0x080771b6 in print_screen (ws_row=63, ws_col=237, if_num=1) at server.c:8279
8279 fprintf(stderr, " %s", strbuf);
(gdb) p strbuf
$14 = " AKD3384HH", ' ' <repeats 139 times>, "\000", ' ' <repeats 106 times>, '\0' <repeats 255 times>
(gdb)
(gdb) p &strbuf
$15 = (char (*)[512]) 0xb54cee1c
(gdb) info registers
eax 0x6 6
ecx 0xb54cc280 -1253260672
edx 0x96 150
ebx 0x20 32
esp 0xb54ce980 0xb54ce980
ebp 0xb54cf058 0xb54cf058
esi 0x5a 90
edi 0x65 101
eip 0x80771b6 0x80771b6 <print_screen+5914>
eflags 0x200246 [ PF ZF IF ID ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
在函数 print_screen 中,我使用(显然)有效参数调用 fprintf,并且不知何故,libc 卡在了 write syscall 中。我不知道问题出在哪里,我只是用有效的字符串缓冲区编写标准错误。
我对这个问题很生气。任何帮助或线索将不胜感激!
(请注意,此函数 print_screen 和 fprintf 调用在 5 小时内一直正常工作)