gdb没有在正确的行上设置断点

时间:2012-04-25 14:47:26

标签: c debugging gdb

我目前正在处理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);

它是SEGFAULTing的行,而不是我设置的断点。 gdb中的bug还是一些古怪的行为?

编辑:添加我正在处理的区域列表:

(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)中的源包重建它,并使用强制为-O0的CFLAGS和SFLAGS进行构建,但它现在不返回gdb中的任何行号段错误,所以我想我在某个地方出了问题。

1 个答案:

答案 0 :(得分:2)

  

它是SEGFAULTing的行而不是我设置的断点

调试优化代码(inflate.c可能是)时,这是预期的。编译器会移动指令,使代码执行在您单步执行时“跳转”。