【发布时间】:2014-07-17 15:03:23
【问题描述】:
我正在开发一个原本不是我自己的代码库(Parrot 的开源 ARDrone 库)。我已经删除了不必要的线程并隔离了一个特定线程的崩溃,即负责从无人机流式传输视频数据包的线程 [a Parrot ARDrone 2.0]。
我已将无人机从 TCP 视频输出更改为不同端口上的 UDP。当我加载 android 应用程序 [AR.Freeflight 2] 时,视频流畅地流了一段时间,但应用程序普遍崩溃,在非常长而复杂的视频管道中执行时出现致命的 SIGBUS。崩溃需要 20 秒到 15 分钟。
我在相关线程上设置了一个信号处理程序,可以成功捕获信号。我完成了将视频输入线程附加到 JVM 的过程,并且我能够使用缓存的全局引用来查找具有静态方法的 Java 类,该方法用于打印当前线程的调用堆栈(我已经用抛出一个新的 RuntimeException 并使用 Thread.dumpStack())。我之所以经历这个艰巨的过程是因为作为 NDK 一部分的仿生版本没有我应该能够直接从信号处理程序调用的本机 backtrace() 函数;看来,此方法已在 stackoverflow 的其他地方显示,可以很好地跟踪整个 C 调用堆栈如果您仍在 Java 生成的线程中。但是,在我的应用程序中,only 调用显示为在我的静态 void 跟踪打印函数之前发生
dalvik.system.NativeStart.run(Native Method)
因此,我不知道如何为我的 android 应用程序获取调用堆栈以找到此崩溃的真实位置,因为 Java 将在第一次 Java 调用线程之前发生的所有事情都视为“一个大 blob C"。有没有人有办法解决这个问题?
更新:我设法从信号处理程序的 void* 最终参数中提取了特定于 android 的 sigcontext 对象,这意味着我现在拥有信号发生之前的指令指针和堆栈指针。在这种情况下,有谁知道我如何调用 _Unwind_Backtrace 从那里回溯调用堆栈,而不是从信号处理程序本身展开?
【问题讨论】:
标签: android multithreading android-ndk stack-trace