gpt4 book ai didi

c - 免费的特殊错误

转载 作者:太空宇宙 更新时间:2023-11-04 05:41:23 26 4
gpt4 key购买 nike

我目前正在调试一个我已经工作了一段时间的项目,并且遇到了一些涉及 free 的疯狂错误。我无法上传代码,因为无法准确判断问题出在哪里(大约 2500 行代码分成 22 个文件),但我会解释我所知道的。

首先,gdb 用于整个调试过程。错误似乎是由对 free 的调用引起的。在程序以 SIGABRT 退出后,我从 gdb 收到以下错误消息:

*** Error in `application': free(): invalid next size (normal): 0x08052008 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x767e2)[0xb7e467e2]
/lib/i386-linux-gnu/libc.so.6(+0x77530)[0xb7e47530]
application[0x8049aef]
application[0x804a8aa]
application[0x8048bee]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0xb7de9935]
application[0x8048a51]
======= Memory map: ========
08048000-08050000 r-xp 00000000 00:16 1571817 application
08050000-08051000 r--p 00007000 00:16 1571817 application
08051000-08052000 rw-p 00008000 00:16 1571817 application
08052000-08073000 rw-p 00000000 00:00 0 [heap]
b7d9c000-b7db7000 r-xp 00000000 08:01 1309022 /lib/i386-linux-gnu/libgcc_s.so.1
b7db7000-b7db8000 r--p 0001a000 08:01 1309022 /lib/i386-linux-gnu/libgcc_s.so.1
b7db8000-b7db9000 rw-p 0001b000 08:01 1309022 /lib/i386-linux-gnu/libgcc_s.so.1
b7dce000-b7dd0000 rw-p 00000000 00:00 0
b7dd0000-b7f7d000 r-xp 00000000 08:01 1308997 /lib/i386-linux-gnu/libc-2.17.so
b7f7d000-b7f7f000 r--p 001ad000 08:01 1308997 /lib/i386-linux-gnu/libc-2.17.so
b7f7f000-b7f80000 rw-p 001af000 08:01 1308997 /lib/i386-linux-gnu/libc-2.17.so
b7f80000-b7f83000 rw-p 00000000 00:00 0
b7f83000-b7fc4000 r-xp 00000000 08:01 1309045 /lib/i386-linux-gnu/libm-2.17.so
b7fc4000-b7fc5000 r--p 00040000 08:01 1309045 /lib/i386-linux-gnu/libm-2.17.so
b7fc5000-b7fc6000 rw-p 00041000 08:01 1309045 /lib/i386-linux-gnu/libm-2.17.so
b7fd9000-b7fdd000 rw-p 00000000 00:00 0
b7fdd000-b7fde000 r-xp 00000000 00:00 0 [vdso]
b7fde000-b7ffe000 r-xp 00000000 08:01 1308973 /lib/i386-linux-gnu/ld-2.17.so
b7ffe000-b7fff000 r--p 0001f000 08:01 1308973 /lib/i386-linux-gnu/ld-2.17.so
b7fff000-b8000000 rw-p 00020000 08:01 1308973 /lib/i386-linux-gnu/ld-2.17.so
bffdf000-c0000000 rw-p 00000000 00:00 0 [stack]

看似普通的double-free,其实还有更多。当它们不包含任何内容时,我倾向于将所有全局指针设置为 NULL,因此即使我双重释放它也不会导致错误。此外,由于我的应用程序处理数据加密,因此我创建了两个自己的函数,它们首先覆盖内存,然后调用 free。

这个问题会不会是内存读取越界引起的?例如,如果我有一个 64 字节的内存块,不小心尝试读取第 65 个字节,这会导致调用 free 时出错吗?我知道写越界,即使不是立即,也会导致错误...

我一整天都在尝试定位错误,但没有成功。 gdb 是否为我的案例提供了任何工具(除了 breaks、step、continue 和 watches 之外)?我可以看到我的代码在内存分配和管理方面的真正作用吗?例如,有没有办法查看在特定指针指向的位置实际分配了多少内存?

提前感谢您的宝贵时间! :)

最佳答案

由于覆盖了未分配的内存,这闻起来很像是损坏的内存管理。

您可能喜欢使用 Valgrind对此进行分析。

关于c - 免费的特殊错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17976780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com