1

現在、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 内の行番号が返されなくなりました。だから私はどこかで間違っていると思います。

4

1 に答える 1

3

設定したブレークポイントではなく、SEGFAULT が実行されている行はどれですか

これは、最適化されたコードをデバッグする場合に予想されます (inflate.cおそらくそうです)。コンパイラは命令を移動させ、ステップ実行時にコード実行を「ジャンプ アラウンド」させます。

于 2012-04-25T17:36:26.870 に答える