轉自:http://blog.sina.com.cn/s/blog_9f4f649d010163sa.html
1. 調用棧系列
下面是函數原型:
1234 |
#include "execinfo .h"int backtrace(void **buffer, int size);char **backtrace_symbols(void *const *buffer, int size);void backtrace_symbols_fd(void *const *buffer, int size, int fd); |
接下來,對上面三個函數進行介紹:
(1)backtrace用來獲得當前程式的調用棧,把結果存在buffer中。通常,我們用gdb偵錯工具,設定合適的斷點,停下來之後,用
backtrace(bt)命令,就可以看到當前的調用棧。但是,有的時候,用到條件斷點的時候,gdb的功能就沒有程式本身的強大了,這個時候,可以考
慮在程式中調用backtrace函數,來擷取調用棧。
(2)backtrace_symbols把用backtrace擷取的調用棧轉換成字串數組,以字串數組的形式返回,使用者需要在外面釋放返回的字串數組所佔用的記憶體
(3)backtrace_symbols_fd把用backtrace擷取的調用棧資訊寫到fd所指定的檔案中
1 |
void * __builtin_return_address (unsigned int level) |
這個函數用來得到當前函數,或者調用它的函數的返回地址,得到這個地址後,通過gdb反組譯碼,便可得到調用函數相關的資訊,這也是在應用中擷取調用棧的一種方法。
2. 記憶體配置、釋放系列
12 |
#include "malloc .h"size_t malloc_usable_size((void *__ptr)); |
這個函數的用法是返回調用malloc後實際分配的可用記憶體的大小。我們都知道在C++中,operator new()可以重載各種各樣的版本,可以傳入調用時的相關資訊來跟蹤記憶體配置情況,但是operator delete()卻只有兩種形式,不能隨意重載,尤其是全域的operator delete(),只有一種版本,這個時候就比較痛苦了,究竟釋放了多少記憶體呢? 這時候malloc_usable_size()這個函數就有用武之地了,調用它便可以擷取當前釋放的記憶體的大小。這裡需要注意的是,如果在delete 中用了malloc_usable_size來計算釋放的記憶體大小,那麼在new中也請用它來統計開闢的記憶體,這樣才能對應起來。因為在調用malloc 時,很多時候實際分配的記憶體會比使用者申請的要大一些,所以如果兩邊的統計方法對應不起來的話,統計結果也會有比較大的判別。
這裡關於new/delete重載的一些細節我不做說明,之前我寫過一篇文章的,不明白的朋友可以去看一下這篇文章《細說C++中的new與delete》。