使用 realloc 强制重定位
Force relocation with realloc
我目前正在用 C 语言编写一个面向数据的库。最近几个小时,我正在寻找一个段错误,该错误是由库中某处深处的 realloc 内存重定位导致的悬空指针引起的。由于这个错误只是由于库的另一部分内存泄漏而发生的,我想知道是否有办法让这个 class 的错误更容易重现。
我的想法是,也许有一种方法可以强制 realloc 在每次调用时重新定位分配的内存。我想在单元测试时这样做,以便及早发现此类错误。
是否有这样的 LD_PRELOAD 库(或类似库)挂钩 malloc/realloc/... 调用,它会因悬挂指针而提前崩溃?
该库旨在跨平台,但我想内存错误是 C 中为数不多的可移植问题之一。
你可以使用 valgrind (at least on Linux) to (sometimes) detect dangling pointers and memory leaks. You'll better compile with debug info (in practice, use gcc -Wall -Wextra -g
for all warnings and debug info with GCC).
您也可以使用 address sanitizer. So use also the -fsanitize=address
instrumentation option。您可能想使用其他消毒剂,也许 -fsanitize=undefined
and/or -fsanitize=leak
...
最后,您可以重新定义自己的 realloc
(在普通 malloc
和 free
之上),或者更仔细地使用一些 myrealloc
函数 always 重新分配和移动内存。
您甚至可以改进您的代码,在多个数据结构或类型中(或之后)添加一些 sentinel values or some magic number。
您可能会阅读更多有关 garbage collection techniques (e.g. with the GC handbook). They provide useful insights, concepts and terminology. And Boehm's GC 也可以用作内存调试器的信息。
这不是您要找的东西,但我敢打赌 Electric Fence 会解决您的问题。
它是一个 malloc 调试器,通过将分配的 space 前后的内存页标记为非 readable/writable 来工作。一旦任何指令试图访问它们,就会发生分段错误。通常这种情况发生在离问题明显的地方很远的地方。
我目前正在用 C 语言编写一个面向数据的库。最近几个小时,我正在寻找一个段错误,该错误是由库中某处深处的 realloc 内存重定位导致的悬空指针引起的。由于这个错误只是由于库的另一部分内存泄漏而发生的,我想知道是否有办法让这个 class 的错误更容易重现。
我的想法是,也许有一种方法可以强制 realloc 在每次调用时重新定位分配的内存。我想在单元测试时这样做,以便及早发现此类错误。
是否有这样的 LD_PRELOAD 库(或类似库)挂钩 malloc/realloc/... 调用,它会因悬挂指针而提前崩溃?
该库旨在跨平台,但我想内存错误是 C 中为数不多的可移植问题之一。
你可以使用 valgrind (at least on Linux) to (sometimes) detect dangling pointers and memory leaks. You'll better compile with debug info (in practice, use gcc -Wall -Wextra -g
for all warnings and debug info with GCC).
您也可以使用 address sanitizer. So use also the -fsanitize=address
instrumentation option。您可能想使用其他消毒剂,也许 -fsanitize=undefined
and/or -fsanitize=leak
...
最后,您可以重新定义自己的 realloc
(在普通 malloc
和 free
之上),或者更仔细地使用一些 myrealloc
函数 always 重新分配和移动内存。
您甚至可以改进您的代码,在多个数据结构或类型中(或之后)添加一些 sentinel values or some magic number。
您可能会阅读更多有关 garbage collection techniques (e.g. with the GC handbook). They provide useful insights, concepts and terminology. And Boehm's GC 也可以用作内存调试器的信息。
这不是您要找的东西,但我敢打赌 Electric Fence 会解决您的问题。
它是一个 malloc 调试器,通过将分配的 space 前后的内存页标记为非 readable/writable 来工作。一旦任何指令试图访问它们,就会发生分段错误。通常这种情况发生在离问题明显的地方很远的地方。