一般Android NDK出現(xiàn)崩潰之后,我們會(huì)使用addr2line工具來進(jìn)行符號(hào)化。如果你使用了C++11的一些特性,那么要注意了,有可能你將得到錯(cuò)誤的函數(shù)名。我們公司是提供崩潰分析相關(guān)的服務(wù)的,采集用戶的崩潰日志,上傳到后臺(tái)服務(wù)器后,會(huì)進(jìn)行符號(hào)化操作。之前一直好好的,最近有用戶說符號(hào)化后的結(jié)果不正確,函數(shù)名和文件及行號(hào)不一致。
企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對(duì)外擴(kuò)展宣傳的重要窗口,一個(gè)合格的網(wǎng)站不僅僅能為公司帶來巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺(tái),創(chuàng)新互聯(lián)公司面向各種領(lǐng)域:成都廣告推廣等成都網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營銷推廣解決方案、網(wǎng)站設(shè)計(jì)等建站排名服務(wù)。
這個(gè)問題其實(shí)蠻奇怪的,要說addr2line可是操作系統(tǒng)級(jí)別的工具,無數(shù)人使用,不可能出這種低級(jí)錯(cuò)誤啊。不過為了進(jìn)一步驗(yàn)證,準(zhǔn)備在自己的PC上用addr2line重現(xiàn)一下,結(jié)果發(fā)現(xiàn),沒有問題,符號(hào)化是正確的。又到服務(wù)器上測試,發(fā)現(xiàn)仍然不對(duì)。查看addr2line的版本,發(fā)現(xiàn)是不同的,如下所示。
[root@tdata ~]# addr2line --version GNU addr2line version 2.20.51.0.2-5.42.el6 20100205 Copyright 2009 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) any later version. This program has absolutely no warranty.
xxx@xxx-desktop:~/Templates/Tyrion-debug-tusuo$ addr2line --version GNU addr2line (GNU Binutils for Ubuntu) 2.24 Copyright 2013 Free Software Foundation, Inc. This program is free software; you may redistribute it under the terms of the GNU General Public License version 3 or (at your option) any later version. This program has absolutely no warranty.
看來應(yīng)該是這個(gè)問題了,同時(shí)操作系統(tǒng)也不同,自己的是Ubuntu,服務(wù)器是CentOS。大家都知道,CentOS上的軟件一般版本都比較老,而且repo源沒有最新版本的更新,需要自己添加源。
首先想是不是將自己PC上的addr2line放到服務(wù)器上,就可以解決問題了,因?yàn)檫@個(gè)文件是C語言寫的二進(jìn)制文件。結(jié)果出現(xiàn)了下面的錯(cuò)誤:
[root@tdata ~]# ./addr2line -f -e libgame.so 0x33e17b ./addr2line: error while loading shared libraries: libbfd-2.24-system.so: cannot open shared object file: No such file or directory
查閱了addr2line的源碼可以發(fā)現(xiàn),它會(huì)引用#include "bfd.h",會(huì)依賴libbfdxxx.so。
接著只能從官方下載新版本,再重新編譯,進(jìn)行addr2line的版本升級(jí)。官網(wǎng)地址為
ftp://sourceware.org/pub/binutils/snapshots/binutils-2.24.90.tar.bz2,你也可以從git上同步代碼下來重新編譯。
注意最好到目標(biāo)機(jī)器上進(jìn)行編譯。在升級(jí)了addr2line之后,一切正常了。