目錄前一節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字符集的子...