我尝试使用dmalloc 5.5.2和glibc 2.17。
在dmalloc中链接始终会导致段错误。
调试时,我发现dmalloc在想要格式化有用的调试消息时会调用vsnprintf(...)。不幸的是,vsnprintf(..)本身调用free(),因此分段错误的原因是递归。 free()调用vsnprintf(),vsnprintf()调用free()等等,直到我们用巨大的堆栈跟踪进行段错误。
可以通过取消定义HAVE_VSNPRINTF和HAVE_VPRINTF来快速解决此问题,但调试消息缺少关键信息。
我通过使用不分配内存的vsnprintf(...)的古老实现来破解我自己的解决方案,但是很难相信它还没有一个好的解决方案那里。
有没有一种标准方法可以用dmalloc解决这个问题?
答案 0 :(得分:2)
由于您发现违规调用是一个无用的调用,因此最简单的解决方法似乎是在if (!p) return;
的{{1}}开头添加dmalloc
。