这个问题已被问了很多次,但它从来没有真正回答过。今天我花了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
您是否知道它是否可以将地址解析为符号名称?因为如果没有 - 我不应该浪费时间。 –