gpt4 book ai didi

java - 使用 Java/JNI 时 Linux 上的信号处理

转载 作者:太空狗 更新时间:2023-10-29 12:10:30 25 4
gpt4 key购买 nike

我在 Wind River Linux 上运行的嵌入式系统上工作。

它是 Java 和 C++ 的混合体,带有一些用于技术间通信的 JNI。

我们构建了自定义错误处理,以便在发生任何意外错误时生成回溯和其他信息来帮助我们确定问题。

此错误处理始终由所有其他组件必须注册的 C++ 组件完成(以便可以安装适当的信号处理程序)。

因此,在 Java 组件的情况下,我们使用 JNI 与 C++ 错误处理程序进行通信。

我们的测试程序使用 35 种不同的场景来测试所有各种类型的错误(内存不足、未处理的异常、访问冲突堆栈溢出等),这是针对单个主线程情况和后台线程完成的。

除了在 JNI 主线程和后台线程中导致的 Stackoverflow 之外,所有测试都正常工作。

在 Linux 上,Stackoverflow 应该生成一个 SIGSEGV 并且应该调用已安装的 sigaction。但我们只是简单地终止,即处理程序不会被调用。

如果我们不生成 stackoverflow,而是直接生成 SIGSEGV(信号 11),我们的信号处理程序会正确调用。

请注意,我们还在 Oracle (Java) 提供的 libjsig.so 上执行了 LD_PRELOAD,据推测这是在使用 JNI 时正确安装自定义信号处理程序所必需的(如果不执行,其他测试用例会失败)。

奇怪的是,如果我在没有 LD_PRELOAD 的情况下运行测试,信号处理程序会在这种情况下被调用。

寻找有关如何调试或解决此问题的想法

最佳答案

当我不得不编写 JNI 代码来处理 SIGSEGV et al - 我的代码必须在异常终止时清理一些文件状态 - 我发现它更容易只需手动链接一个 SIGABRT 处理程序,根本不使用 libjsig.so。 JVM 似乎总是以 SIGABRT 异常终止 - 我会导致致命的 SIGSEGV,JVM 会处理并将其转换为 SIGABRT .我所做的似乎并不重要。

我现在无法在 Oracle 文档中找到它,但是 IBM documents JVM signal handling thus :

Errors

The JVM raises a SIGABRT if it detects a condition from which it cannot recover.

我的代码的一个版本(缩写以消除滚动条):

typedef void ( *sigaction_handler_t )( int, siginfo_t *, void * );
static sigaction_handler_t original_sigabort_handler = NULL;

static void handler( int sig, siginfo_t *info, void *arg )
{
switch ( sig )
{
case SIGABRT:
//do stuff - stack trace, setrlimit() to generate core file, etc.
if ( NULL != original_sigabort_handler )
{
original_sigabort_handler( sig, info, arg );
}
break;
default:
break;
}
}

__attribute(( constructor )) void library_init_code( void )
{
struct sigaction new_act, old_act;
memset( &new_act, 0, sizeof( new_act );
memset( &old_act, 0, sizeof( old_act );
sigemptyset( &( new_act.sa_mask ) );
new_act.sa_sigaction = handler;
new_act.sa_flags = SA_SIGINFO;

sigaction( SIGABRT, &new_act, &old_act );
if ( ( old_act.sa_sigaction != ( sigaction_handler_t ) SIG_IGN ) &&
( old_act.sa_sigaction != ( sigaction_handler_t ) SIG_DFL ) )
{
original_sigabort_handler = old_act.sa_sigaction;
}
}

关于java - 使用 Java/JNI 时 Linux 上的信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46647659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com