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

2024-02-06

我从事在 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 记录了 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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Java/JNI 时 Linux 上的信号处理 的相关文章

  • Hybris:如何在impex中导入zip文件中的媒体?

    我知道我们可以导入未像这样压缩的图像 siteResource jar com project initialdata constants ProjectInitialDataConstants projectinitialdata imp
  • 应用新设置时如何防止 GraphicsDevice 被丢弃?

    我的游戏窗口允许手动调整大小 这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小 游戏还利用了RenderTarget2D rt2d 在主 Draw 方法中设置主渲染目标 GraphicsDevice SetRenderTarge
  • C#生成的csv文件通过电子邮件发送嵌入到Lotus Note中电子邮件的底部

    我遇到了一个奇怪的问题 即使用 NET SmtpClient 通过电子邮件发送的 CSV 附件出现在电子邮件底部 而不是 Lotus Note 中的附件 我只是不知道如何解决这个问题 而且我无法访问客户端计算机 这使得调试非常困难 我可以采
  • 为什么 rand() 总是返回相同的值? [复制]

    这个问题在这里已经有答案了 可能的重复 在C中生成随机数 https stackoverflow com questions 3067364 generating random numbers in c 使用 rand 生成随机数 http
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 在 Spring MVC 中将请求写入文件

    我希望能够将整个请求写入 Spring MVC 控制器中的文件 我已尝试以下操作 但即使我使用大量参数发出 POST 请求 文件也始终为空 RequestMapping method RequestMethod POST value pay
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • 确定相关词的编程方式?

    使用网络服务或软件库 我希望能够识别与词根相关的单词 例如 座位 和 安全带 共享词根 座位 但 西雅图 不会被视为匹配 简单的字符串比较对于这类事情似乎是不可行的 除了定义我自己的字典之外 是否有任何库或 Web 服务不仅可以返回单词定义
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 如何在 ASP.NET Core 项目中使用 MStest 测试 Ok() 结果

    我正在使用 MStest 来测试我的控制器 我想测试这个动作 HttpGet Name GetGroups public async Task
  • 用于生成 ISO 文件的 Maven 插件

    有没有可以生成ISO镜像的maven插件 我需要获取一些模块的输出 主要是包含 jar 的 zip 文件 并将它们组合成一个 ISO 映像 Thanks 现在有一个 ISO9660 maven 插件可以完成这项工作 https github
  • junit4 使用特定测试方法创建测试套件

    在 junit4 中 我想执行来自不同类的特定测试方法 即想要使用来自不同类的特定测试方法创建一个测试套件 假设我有两门课 public class Test Login Test public void test Login 001 Sy
  • 在用户程序中使用 或在驱动程序模块代码中使用 ...这有关系吗?

    我正在开发一个设备驱动程序模块和关联的用户库来处理ioctl 来电 该库获取相关信息并将其放入一个结构中 该结构被传递到驱动程序模块中并在那里解压 然后进行处理 我省略了很多步骤 但这就是总体思路 一些数据通过结构体传递ioctl is u
  • 使用 WinAPI 连接禁用的显示设备

    我的问题是启用禁用的监视器ChangeDisplaySettingsEx 我想这不是火箭科学 但经过一番挖掘后 它看起来仍然是不可能的 我找到了一种根据找到的 Microsoft 代码示例禁用所有辅助显示器的方法here https msd
  • 假布尔值=真?

    我在一本书中找到了这段代码 并在 Netbeans 中执行了它 boolean b false if b true System out println true else System out println false 我只是不明白为什
  • 包含从代码隐藏 (ASP.NET C#) 到 ASPX 中的图像概述的图像列表 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Web API 2.0 使用 pascalcase 模型接收驼峰式命名的 JSON 数据

    我正在尝试对我的 Web API 进行 PUT 调用 我在 WebApiConfig cs 中设置了以下内容 以处理以驼峰形式将数据发送回我的 Web 项目 config Formatters JsonFormatter Serialize
  • C# 和断点 - 这里有魔术师吗?

    我有这个 public static void ByLinkText string text for var i 0 i lt 50 i try Setup Driver FindElement By LinkText text Click
  • 在两个点之间创建一条曲线,每个点都具有标准化向量

    因此 我需要一种写入方法来在两点之间创建一条曲线 每个点都有一个指向任意方向的归一化向量 我一直在尝试设计这样一种方法 但一直无法理解数学 在这里 由于一张图片胜过一千个文字 这就是我所需要的 在图中 矢量垂直于红线 我相信向量需要进行相同
  • 查找并删除超过 x 天的文件或文件夹

    我想删除超过 7 天的文件和文件夹 所以我尝试了 17 07 14 email protected cdn cgi l email protection find tmp mindepth 1 maxdepth 1 ctime 7 exec

随机推荐

  • “主要”java.lang.NoClassDefFoundError:org / apache / http / HttpEntity

    我正在尝试在我的项目中使用 apache http 库 我在我的项目中导入了库https i stack imgur com Cm9ck jpg https i stack imgur com Cm9ck jpg 当我运行我的程序时 我收到
  • 在 Razor 组件 (Blazor) 中渲染 Razor 部分视图

    我最近发现了 Blazor 并且一直在尝试一些测试项目 以更好地评估如何将其包含在未来的项目中 由于具有 MVC 背景 我从一个 MVC 项目开始 并向其中添加了 Razor 组件 并将其嵌套在标准 MVC razor 页面中 反过来可能吗
  • Windows 会清除内存页吗?

    我知道 Windows 有一个选项可以清除页面文件当它关闭时 当实际物理 虚拟内存进入或超出范围时 Windows 是否会对实际物理 虚拟内存执行任何特殊操作 例如 假设我运行应用程序 A 它将可识别的字符串写入内存中的变量 然后关闭该应用
  • 使用参数调用事件处理程序

    Visual Studio 2008 C 3 0 我有一个调用事件处理程序的方法 我想将该方法接收到的两个参数传递给事件处理程序 我想做这样的事情 wc DownloadDataCompleted wc DownloadedDataComp
  • 计算进行时显示进度条

    我正在编写代码来计算 Pi 的值 有时可能需要很长时间才能计算 我添加了一个进度条来显示进度 但代码完全按照我的指示执行 它在计算后打开进度条 然后立即关闭它 当值达到 100 时它会关闭 我试图将进度条的代码粘贴到循环中 但很快我意识到这
  • HighcharteR:绘图带和绘图线不起作用

    我正在尝试在 highcharteR 中绘制每日值系列 在图表中标记垂直线 绘图线 和日期周期 绘图带 我研究了几个SO问题并达到了这个脚本 但我发现了以下问题 1 未绘制绘图区 2 未绘制情节 3 x轴应该是以我不理解的方式转换的日期 我
  • FormControl uniqueUntilChanged() 不起作用

    我很难做distinctUntilChanged在下一个场景中工作 我制作了一个异步验证器 它使用服务来检查给定用户名的用户是否存在 该验证器作为指令绑定到输入 class ValidateUniqueUsernameDirective i
  • 可以配置 Tmux 加载 ~/.bashrc 而不是 ~/.bash_profile 吗?

    现在 当我登录 Tmux 时 仅 bash profile被加载 我想要 bashrc改为被呼叫 那可能吗 这个问题与以下无关tmux 要解决它 请确保添加source bashrc to bash profile就是这样 您可以了解更多有
  • dynamoDB - 通过主键数组从数据库获取多个项目

    我有一个用户 id 数组 我想从 dynamoDB 表中获取具有该 id 的所有用户 文档里没找到 有任何想法吗 我最终使用了batchGet 这是一个操作AWS DynamoDB DocumentClient http docs aws
  • ORG指令后设置段寄存器

    我目前正在关注操作系统开发教程 http brokenthorn com Resources OSDev4 html 其中包括有关引导加载程序的讨论 我的引导加载程序当前处于 16 位实模式 因此 我能够使用提供的 BIOS 中断 例如 V
  • 为什么不能在 do while 循环的表达式部分内声明变量?

    以下语法有效 while int i get data 但以下情况则不然 do while int i get data 我们可以通过标准草案了解原因N4140部分6 4 1 condition expression attribute s
  • Panda 的 DataFrame 双转置将数字类型更改为对象

    我正在从 Excel 中的两个不同位置读取数据帧的标题和数据 两者都正确对齐但不相邻 标题可能包含许多空白 因此我需要丢弃这些标题和数据中相应的列 所以我的最终帧具有非空标头和与这些标头相对应的数据 下面使用转置的逻辑有效 但我在双重转置时
  • 无法解析类型“System.Net.Http.HttpClient”的服务

    我创建了一个ViewComponent调用一个类REST API使用HttpClient 这是代码 public class ProductsViewComponent ViewComponent private readonly Http
  • C 中的默认参数和参数提升

    我当时正在研究默认参数提升 并陷入了困境 在 C 2011 ISO IEC 9899 2011 中 相关部分似乎是 6 5 2 2 函数调用 6 如果表示被调用的表达式 函数具有不包含原型的类型 即整数 对每个参数执行升级 并且具有以下参数
  • 从 ASP.NET 中的 URL 获取数据

    我是 ASP NET 新手 我想从 ASP NET 上的 url 获取数据 需要将数据存储到字符串中 如果假设这是我的 URL 那么我想以字符串形式获取此 URL 数据 http www islamicfinder org prayer s
  • 将 XPath count() 与 contains() 结合使用

    我正在使用以下 次优 XML a b b a
  • mysql 中未来日期的日期时间值不正确

    MySQL语句 insert into banners path app id enabled from date to date updated at created at values banners example png com e
  • SSL 在 Chrome 中工作,但有时在 Firefox 中工作,而不在 IOS、Android 或 Blackberry 上工作

    我有 SSL 问题 我已将站点从一台服务器移至另一台服务器 因此必须移动 SSL 不幸的是 新服务器的根域与原始服务器不同 示例 原始版本为 www domain com 新版本为 www domainisnew com 我有多个网站使用此
  • 根据其他数据框中提供的范围值创建新列

    我有两个数据框 其中一个数据框作为参考表 另一个包含实际值 gt gt gt reference table MinRange MaxRange Multiplier Group 0 10 30 2 A 1 10 40 4 B 2 10 1
  • 使用 Java/JNI 时 Linux 上的信号处理

    我从事在 Wind River Linux 上运行的嵌入式系统的工作 它是 Java 和 C 的混合体 并带有一些用于技术之间通信的 JNI 我们构建了自定义错误处理 以便在出现任何意外错误时生成回溯和其他信息来帮助我们确定问题 此错误处理