我目前正在C中编写一个面向大量数据的库。过去几个小时我一直在寻找一个由于内存重定位导致的悬空指针引起的段错误,并在库内部的某处重新放置。由于这个错误只是由于库中其他部分的内存泄漏而发生,我想知道是否有办法使这类错误更具可重复性。
我有这个想法,也许有一种方法可以强制realloc在每次调用时重新分配已分配的内存。我希望在进行单元测试时尽早捕获这些错误。
是否有这样一个LD_PRELOAD库(或类似的)以一种方式挂钩malloc / realloc / ...调用它会因为悬空指针而早期崩溃?
该库旨在跨平台,但我想内存错误是C中为数不多的便携式内容之一。
答案 0 :(得分:6)
您可以使用valgrind(至少在Linux上)来(有时)检测悬空指针和内存泄漏。您最好使用调试信息进行编译(实际上,使用gcc -Wall -Wextra -g
使用GCC进行所有警告和调试信息。)
您也可以使用address sanitizer。因此,请同时使用-fsanitize=address
instrumentation option。您可能想要使用其他清洁剂,可能是-fsanitize=undefined
和/或-fsanitize=leak
...
最后,您可以重新定义自己的realloc
(高于普通malloc
& free
),或者更谨慎地拥有一些始终<的myrealloc
功能/ em>重新分配并移动内存。
您甚至可以改进代码,在几个数据结构或类型中添加一些sentinel values或一些magic number。
您可能会阅读有关garbage collection技术的更多信息(例如使用GC handbook)。它们提供了有用的见解,概念和术语。 Boehm's GC也可以用作内存调试器。
答案 1 :(得分:2)
这不完全是你想要的,但我敢打赌,Electric Fence将解决你的问题。
它是一个malloc调试器,它通过在分配的空间之前和之前将内存页面标记为不可读/可写来工作。只要任何指令尝试访问它们,就会发生分段错误。通常这种情况发生在远离问题使其可见的地方。