通過程式設計方式獲取backtrace

2021-04-23 18:35:13 字數 1874 閱讀 8927

在用gdb

偵錯程式時可以檢視所謂的

backtrace

,它包含一系列的函式呼叫資訊,用命令

backtrace或bt

可以在gdb

中檢視函式呼叫棧的資訊。有些場合沒法使用

gdb時,則可以用

glibc

庫函式中的一些相關函式來得到

backtrace

的資訊(在標頭檔案

execinfo.h

中):

// 獲取將

backstrace

資訊,將位址存到

buffer

中。 //

引數size

指定buffer

的最大值,返回值則是

backstrace

的實際大小

int backtrace (void **buffer, int size)

// 根據buffer

指定的位址,返回符號資訊。引數

size

指定返回符號資訊的大小

char ** backtrace_symbols (void *const *buffer, int size)

// 類似backtrace_symbols()

函式,但是不需要

malloc

空間來存放符號資訊,

// 而是將結果寫到檔案描述符

fd所代表的檔案中

void backtrace_symbols_fd (void *const *buffer, int size, int fd)

使用函式

backtrace_symbols()

或者backtrace_symbols_fd()

時,需要用

-rdynamic

編譯才能得到正確的符號名,否則只能得到偏移位址。

下面的示例**應用了

backtrace()

和backtrace_symbols()

函式來列印

backtrace

的資訊:

1#include

2#include

3#include

4 5/* obtain a backtrace and print it to stdout. */

6void print_trace (void)

7 23

24/* a dummy function to make the backtrace more interesting. */

25void dummy_function (void)

26 29

30int main (void)

31編譯執行的結果如下:

# gcc bt.c -rdynamic -o bt

# ./bt

obtained 5 stack frames.

./bt(print_trace+0x14) [0x80486e4]

./bt(dummy_function+0xb) [0x8048765]

./bt(main+0x15) [0x

804877c

]/lib/tls/libc.so.6(__libc_start_main+0xe4) [0x42015574]

./bt(backtrace_symbols+0x31) [0x8048641]

你可以應用這些函式在程式異常退出時列印

backtrace

或將它儲存到某個檔案中,用於之後的分析。更詳細的介紹可以參考

通過反射獲取類的三種方式

一 通過類全限定名進行獲取class.forname classfullname class c class.forname com.mysql.jdbc.driver 二 通過型別獲取,另外任何資料型別都有乙個靜態的屬性class 型別獲取 class c studentinfo.class 任何...

通過反射的方式獲取類物件的屬性

public class searchproperty catch classnotfoundexception nosuchfieldexception illegalacces ception nosuchmethodexception e catch invocationtargetexcep...

上位機通過UDP方式獲取MCU傳送的資料

我的硬體裝置是使用的wifi串列埠模組,mcu將要傳送的資料通過wifi串列埠模組傳送出來。由於我需要的資料傳送頻率較高,且不需要可靠傳輸,所以採用了udp方式。為了在上位機上顯示收到的資料,需要用到win32的socket程式設計。結合網路上的資料,我的 整理如下 標頭檔案 include std...