我想使用dmalloc版本5.5.2和glibc 2.17。vsnprintf上有關於dmalloc假設的標準解決方法嗎?
在dmalloc中鏈接總是會導致段錯誤。
調試時,我發現dmalloc在要格式化有用的調試消息時調用vsnprintf(...)。不幸的是,vsnprintf(..)本身調用free(),所以分段錯誤的原因是遞歸。 free()調用vsnprintf(),vsnprintf()調用free()等,等等,直到我們用一個巨大的堆棧跟蹤segfault。
可以通過取消定義HAVE_VSNPRINTF和HAVE_VPRINTF來快速修復此問題,但調試消息缺少關鍵信息。
我用自己的解決方案解決了這個問題,它使用了一個古老的vsnprintf(...)實現,它沒有分配內存,但很難相信還沒有一個好的解決方案。
有沒有標準的方法來解決這個問題與dmalloc?
似乎很奇怪'vsnprintf'會調用'free' ...你能弄清楚爲什麼/它在做什麼? – nneonneo 2014-08-29 16:50:58
在調用堆棧中,vsnprintf調用實際調用free的vprintf。第二個空閒地址也是NULL。這看起來像是libc中的一個錯誤。 – user3200145 2014-08-29 18:01:27
不是一個錯誤(你可以在任何你想要的地方調用'free(0)',所以'vsnprintf完全有資格),但是不必要的東西讓你的生活比需要的更難。 – 2014-08-29 18:21:37