Linux 解碼backtrace返回資訊

2022-09-21 12:21:09 字數 2650 閱讀 6156

目錄前一節linux backtrace()系列函式 ,已經知道可以通過backtrace,backtrace_symbols得到函式的呼叫棧資訊。不過,在c++中,得到的是一堆難以識別的符號,如何解碼得到準確的函式名資訊?

如,前面得到的函式呼叫棧資訊:

$ ./backtrace 2

backtrace() return 7 address

./backtrace(_z7myfunc3v+0x1f) [0x400a8c]

./backtrace() [0x400b45]

./backtrace(_z6myfunci+0x25) [0x400b6c]

./backtrace(_z6myfunci+0x1e) [0x400b65]

./backtrace(main+0x59) [0x400bc7]

/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f7170ed1f45]

./backtrace() [0x4009a9]

(_z7myfunc3v+0x1f) [0x400a8c],晦澀難懂。

我們可以用glibc提供的abi::__cxa_demangle(),對得到的函式符號資訊進行解碼。

__cxa_demangle詳細參見:如何在c++中獲得完整的型別名稱 | csdn

下面一段**來自chensuo muduo,對其做了簡單修改,以便列印完整資訊。

// from chensuo muduo project

// #include #include #include #include #include #include #include string stacktrace(bool demangle)

if (left_par && plus)}}

// fallback to mangled names

stack.push_back('\n');

}free(demangled);

free(strings);

}return stack;

}

還是用來執行前一節的示例,可以得到

$./test_demo 2

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo(myfunc3())

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo() [0x40133d]

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo(myfunc(int))

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo(myfunc(int))

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo(main+0xd2) [0x4017bc]

/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7f8fb1213f45]

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo() [0x401209]

注意到這裡有2個myfunc,而沒有myfunc2。檢查**發現myfunc2是static函式,推測可能是static修飾符的影響,導致無法正確解碼myfunc2符號資訊。

去掉static限制:

static void myfunc2()

// 修改為

void myfunc2() // 去掉了static

再次執行之

$./test_demo 2

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo(myfunc3())

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo(myfunc2())

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo(myfunc(int))

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo(myfunc(int))

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo(main+0xd2) [0x4017ec]

/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5) [0x7faf0ff12f45]

/home/martin/workspace/clionprojects/c++/test_demo/bin/test_demo() [0x401239]

可以發現,函式名的順序,已經之前的推測的呼叫順序完全一致。

linux 編譯碼硬體加速

一 驅動安裝過程 報錯 configure.ac error required file autoconf ltmain.sh not found 解決辦法 libtoolize automake copy debug force 1.環境安裝 yum install autoconf yum y ...

編譯碼 霍夫曼編譯碼

1.檔案源 原始影象分塊為 8 8 在rle編碼之後做霍夫曼編碼。其中rle碼字格式如下。struct rlecode 2.構建霍夫曼表 本文中使用的為jpeg標準ac y霍夫曼表。構建乙個256維大小的碼表hufftable,其霍夫曼碼字結構如下。struct huffcode 3.關鍵幀霍夫曼編...

編碼 解碼 中文編譯碼

字串和字符集的關係 字串是python程式的一種格式 位元組串是網路傳輸的一種形式 字串和位元組串轉換 字串 str encode 位元組串 bytes 位元組串 bytes decode 字串 str ascii字符集是utf 8字符集的前128位字元,可以說ascii字符集是utf 8字符集的子...