在用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...