我开发了一个Java工具,它有许多JNI功能,我经常遇到JNI崩溃。有没有可能避免这些崩溃或将这些崩溃作为例外捕获。我上网,发现通过信号处理、信号处理、sigaction()等是可能的。但是我找不到可靠的来源来指导我。请在这方面指导我。
JNI 异常被视为信号。您可以通过 sigaction
设置信号处理程序,然后可以尝试展开崩溃堆栈,例如通过 libcorkscrew
将其保存在磁盘上。之后,您可以通过 JNI 接口调用 Java 方法来处理您保存的信息。
样本:
int watched_signals[] = { SIGABRT, SIGILL, SIGSEGV, SIGINT, SIGKILL };
void sighandler_func(int sig, siginfo_t* sig_info, void* ptr)
{
// Dump the callstack by libcorkscrew
...
// Call a JNI interface to process the stack info
...
}
struct sigaction sighandler;
sighandler.sa_sigaction = &sighandler_func;
sighandler.sa_mask = 0;
sighandler.sa_flags = SA_SIGINFO | SA_ONSTACK;
for(int signal : watched_signals)
{
sigaction(signal, &sighandler, nullptr);
}
假设您已经将libcorkscrew加入到ndk项目中,那么您可以得到崩溃堆栈:
#include <dlfcn.h>
#include <ucontext.h>
#include <corkscrew/backtrace.h>
#include <backtrace-arch.h>
void dump_stack(int sig, siginfo_t* sig_info, void* ptr)
{
const size_t BACKTRACE_FRAMES_MAX = 0xFF;
static backtrace_frame_t frames[BACKTRACE_FRAMES_MAX];
static backtrace_symbol_t symbols[BACKTRACE_FRAMES_MAX];
map_info_t* const info = acquire_my_map_info_list();
const ssize_t size = unwind_backtrace_signal_arch(sig_info, ptr, info, frames, 0, BACKTRACE_FRAMES_MAX);
get_backtrace_symbols(frames, size, symbols);
for (int i = 0; i < size; i++)
{
backtrace_symbol_t& symbol = symbols[i];
// You could change the printf to fwrite if you want to save the info on disk
printf("#%02d pc %08X %s (%s+%d)",
i,
symbol.relative_pc,
symbol.map_name ? symbol.map_name : "<unknown>",
symbol.demangled_name ? symbol.demangled_name : symbol.symbol_name,
symbol.relative_pc - symbol.relative_symbol_addr);
}
free_backtrace_symbols(symbols, size);
release_my_map_info_list(info);
}
即使你可以在处理信号后继续该程序,但我强烈建议你将信息保存在磁盘上,并在下次应用程序启动时处理。因为在大多数情况下,当信号发出时,程序会失败。
我有Android原生C代码。然而,有时当我将应用程序发送到后台并返回时,它会与<code>SIGSEGV 在方法中,我添加了: 我有: 然而,当应用程序从后台退出时,< code>android_sigaction不会因该错误而触发。我试图在代码中创建bug(在数组边界之外编写),用按钮触发它,回调被正确调用。这是怎么回事?
我开发了一个使用原生C库的Android应用程序。我可以成功地用JNI编译整个程序,一切都很顺利。 然而,本机C库偶尔会崩溃(最常见的是SIGSEGV)。这反过来会导致我的应用程序崩溃,而不会对用户发出任何有意义的通知。我希望实现以下目标: 使用信号处理程序(sigaction)捕获本机代码中的信号,以防止随机崩溃 在 C 库中抛出 Java 可以捕获的异常 在 Java 中捕获异常,为用户生成有
本文向大家介绍详解Android中处理崩溃异常,包括了详解Android中处理崩溃异常的使用技巧和注意事项,需要的朋友参考一下 大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了崩溃现象,开发者应该及时获取在该设备上导致崩溃的信息,这对于下一个版本的
前面介绍了异常的产生是不可避免的,那么为了保证程序有效地执行,需要对发生的异常进行相应的处理。 Java 的异常处理通过 5 个关键字来实现: try、 catch、 throw、 throws 和 finally。 try catch 语句用于捕获并处理异常,finally 语句用于在任何情况下(除特殊情况外)都必须执行的代码,throw 语句用于拋出异常,throws 语句用于声明可能会出现的
我目前在我的路由中使用dotry/doCatch块,因此我无法使用全局onException块。 然而,如果驼峰路由中断(由于错误代码或意外/未测试的场景),我希望执行一些业务逻辑。希望这永远不会发生,但我仍然想处理更糟糕的情况。 我不能在全局OneException块中有java.lang.Exception,而且,我不想在每个路由上都添加一个额外的捕获。 在抛出未捕获的异常和中断路由之前,是否
本节介绍如何使用三个异常处理程序组件(try、catch 和 finally)来编写异常处理程序。 然后,介绍了 Java SE 7中引入的 try-with-resources 语句。 try-with-resources 语句特别适合于使用Closeable的资源(例如流)的情况。 本节的最后一部分将通过一个示例来分析在各种情况下发生的情况。 以下示例定义并实现了一个名为ListOfNumbe