2014-08-29 51 views
1

我想使用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?

+0

似乎很奇怪'vsnprintf'會調用'free' ...你能弄清楚爲什麼/它在做什麼? – nneonneo 2014-08-29 16:50:58

+0

在調用堆棧中,vsnprintf調用實際調用free的vprintf。第二個空閒地址也是NULL。這看起來像是libc中的一個錯誤。 – user3200145 2014-08-29 18:01:27

+1

不是一個錯誤(你可以在任何你想要的地方調用'free(0)',所以'vsnprintf完全有資格),但是不必要的東西讓你的生活比需要的更難。 – 2014-08-29 18:21:37

回答

2

既然你已經發現有問題的呼叫是廢人一個用空的說法,最簡單的解決方法似乎在dmallocfree的開始被添加if (!p) return;

+0

只需添加「if(pnt == NULL)return(FREE_NOERROR);」在dmalloc_free的頂部修復了這個問題。 – user3200145 2014-08-29 20:01:22

相關問題