当我不得不编写 JNI 代码来处理时SIGSEGV
et al- 我的代码必须在异常终止时清理某些文件状态 - 我发现手动链接一个文件会更容易SIGABRT
处理程序而不使用libjsig.so
根本不。 JVM 似乎总是异常终止SIGABRT
- 我会造成致命的SIGSEGV
,JVM 将处理并转换为SIGABRT
。我做了什么似乎并不重要。
我现在在 Oracle 文档中找不到它,但是IBM 记录了 JVM 信号处理 https://www.ibm.com/support/knowledgecenter/en/SSYKE2_8.0.0/com.ibm.java.zos.80.doc/user/sighand.html:
Errors
JVM 引发一个SIGABRT
如果它检测到无法恢复的情况。
我的代码的一个版本(为了消除滚动条而缩写):
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;
}
}