幾個關於C/C++程式調試的函數

來源:互聯網
上載者:User

轉自: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》。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.