現在、Qt/zlib のバグに取り組んでおり、変数がクラッシュしている行の前で変数が破損しているかどうかを確認しようとしているためbreak 1245
、前の行にブレークを設定していました。でも:
(gdb) info break
Num Type Disp Enb Address What
6 breakpoint keep y 0x02cb0e1e in inflateEnd at inflate.c:1245
breakpoint already hit 6 times
(gdb) c
Continuing.
[Thread 0xb103db70 (LWP 26146) exited]
[Thread 0xb5a74b70 (LWP 26143) exited]
Breakpoint 6, inflateEnd (strm=0x86ccdc0) at inflate.c:1246
1246 if (state->window != Z_NULL) ZFREE(strm, state->window);
これは、設定したブレークポイントではなく、SEGFAULT が実行されている行です。gdb のバグですか、それとも風変わりな動作ですか?
編集:私が取り組んでいる領域のリストを追加します:
(gdb) list
1241 {
1242 struct inflate_state FAR *state;
1243 if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
1244 return Z_STREAM_ERROR;
1245 state = (struct inflate_state FAR *)strm->state;
1246 if (state->window != Z_NULL) ZFREE(strm, state->window);
1247 ZFREE(strm, strm->state);
1248 strm->state = Z_NULL;
1249 Tracev((stderr, "inflate: end\n"));
1250 return Z_OK;
(gdb)
編集: コメントからアドバイスを受け取り、ubuntu (apt-get source) のソース パッケージを使用して再構築し、CFLAGS と SFLAGS を -O0 に強制してビルドしましたが、segfault の gdb 内の行番号が返されなくなりました。だから私はどこかで間違っていると思います。