c - gdb 未在正确的行上设置断点

标签 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 中的错误或一些奇怪的行为?

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

(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 进行构建,但是它现在不会在 gdb 中返回任何行号段错误,所以我认为我在某个地方出错了。

最佳答案

Which is the line that it's SEGFAULTing on rather than the breakpoint I've set

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

关于c - gdb 未在正确的行上设置断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10318137/

相关文章:

c++ - C++ 中 undefined reference

c - Ubuntu/linux 中 eclipse IDE 中的 OpenMP for C

Python:有可用的运行时变量浏览器吗?

android - Android-Logcat错误

java - Java 调试中的回溯

c++ - Eclipse 调试错误 : No such file or directory\n

C编程gdb报错信息

c - 如何从函数中取回指针的指针

c - 我的 SHA256 哈希函数有什么问题?

c++ - 无法获取ms _tzSet()示例进行编译