這個問題已被問了很多次,但它從來沒有真正回答過。今天我花了5到6個小時試圖將一些庫移植到Android(libunwind,liwdfl),這些可能從未打算用於ARM。當然無濟於事。如何在Android上打印堆棧跟蹤(帶符號函數名稱)?
問題是Android缺少backtrace
/backtrace_symbols
函數。有沒有人找到一種方法來打印堆棧跟蹤,例如,收到SIGSEGV後?
這個問題已被問了很多次,但它從來沒有真正回答過。今天我花了5到6個小時試圖將一些庫移植到Android(libunwind,liwdfl),這些可能從未打算用於ARM。當然無濟於事。如何在Android上打印堆棧跟蹤(帶符號函數名稱)?
問題是Android缺少backtrace
/backtrace_symbols
函數。有沒有人找到一種方法來打印堆棧跟蹤,例如,收到SIGSEGV後?
這是內部完成的方式是CallStack類。例如:
CallStack cs("logtag");
會將當前本地調用堆棧轉儲到日誌。不幸的是,這在NDK中是不可用的,並且類從不同版本變化。
在Android KitKit(4.4)中,implementation使用內部的libcorkscrew庫。在當前的「主」分支中,implementation使用libbacktrace,這也是一個內部庫。不過,這個新庫建在libunwind,一個open-source project。
所以你應該能夠在你的應用中構建libunwind並以這種方式使用它。由於這些庫已經在Android上使用,因此移植應該不會成爲問題(只需從AOSP external/libunwind來源開始)。
我看了一下'CallStack'類,沒有看到編譯它的方法,也沒有編譯一半的AOSP存儲庫。但是如果沒有更好的方法,我想我會試試看。 –
我認爲將AOSP的外部/ libunwind引出並在其上構建一些CallStack-ish會更有意義。 「外部」中的內容通常不會對其他內容產生重要的依賴關係,並且您知道它已被移植到Android上。 – fadden
您是否知道它是否可以將地址解析爲符號名稱?因爲如果沒有 - 我不應該浪費時間。 –