0

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 でスタックします。どこに問題があるのか​​ わかりません。有効な文字列バッファを使用してstderrを書いているだけです..

私はこの問題に腹を立てています。どんな助けや手がかりもいただければ幸いです!!

(この関数 print_screen と fprintf 呼び出しが 5 時間の間正しく機能していることに注意してください)

4

0 に答える 0