调试严重的 SIGILL 崩溃:文本段损坏

2024-04-27

我们的系统是基于 PowerPC 的运行 Linux 的嵌入式系统。我们遇到了随机的 SIGILL 崩溃,这种情况在各种应用程序中都会出现。崩溃的根本原因是将要执行的指令归零。这表明内存中的文本段已损坏。由于文本段是以只读方式加载的,因此应用程序无法损坏它。所以我怀疑某些常见的子系统(DMA?)导致了这种损坏。由于问题需要几天的时间才能重现(由于 SIGILL 导致崩溃),因此调查变得越来越困难。因此,首先我希望能够知道任何应用程序的文本段是否以及何时已损坏。 我查看了堆栈跟踪,所有指针、寄存器都是正确的。
你们有什么建议我该怎么做吗?

一些信息:
Linux 3.12.19-rt30 #1 SMP 3 月 11 日星期五 01:31:24 IST 2016 ppc64 GNU/Linux

(gdb) BT
xxx 中的 0 0x10457dc0

反汇编输出:
=> 0x10457dc0 : 先生 r1,r11
0x10457dc4 :blr

地址 0x10457dc0 处预期指令:0x7d615b78
捕获 SIGILL 0x10457dc0 后发现指令:0x00000000

(gdb) 维护信息部分
0x10006c60->0x106cecac位于0x00006c60:.text ALLOC LOADREADONLY代码有_内容

预期(来自应用程序二进制文件):
(gdb) x /32 0x10457da0
0x10457da0:0x913e0000 0x4bff4f5d 0x397f0020 0x800b0004
0x10457db0:0x83abfff4 0x83cbfff8 0x7c0803a6 0x83ebfffc
0x10457dc0:0x7d615b780x4e800020 0x7c7d1b78 0x7fc3f378
0x10457dd0:0x4bcd8be5 0x7fa3eb78 0x4857e109 0x9421fff0

实际(处理 SIGILL 并转储附近的内存位置后):
错误指令地址:0x10457dc0
0x10457da0:0x913E0000
0x10457db0:0x83ABFFF4
=> 0x10457dc0:0x00000000
0x10457dd0:0x4BCD8BE5
0x10457de0:0x93E1000C

Edit:
我们得到的一条线索是,损坏总是发生在以 0xdc0 结尾的偏移处。
例如
错误指令地址:0x10653dc0错误指令地址:0x1000ddc0flash_erase[8557]:未处理的信号 40fed6dc0咬合 0fed6dc0 lr 0fed6dac 代码 30001
nandwrite[8561]:未处理的信号 40fed6dc0咬合 0fed6dc0 lr 0fed6dac 代码 30001
awk[4448]: 未处理的信号 40fe09dc0咬合 0fe09dc0 lr 0fe09dbc 代码 30001
awk[16002]:未处理的信号 40fe09dc0咬合 0fe09dc0 lr 0fe09dbc 代码 30001
getStats[20670]:未处理的信号 40fecfdc0nip 0fecfdc0 lr 0fecfdbc 代码 30001
expr[27923]:未处理的信号 40fe74dc0咬合 0fe74dc0 lr 0fe74dc0 代码 30001

编辑 2:另一个线索是损坏总是发生在物理帧编号 0x00a4d 处。我想当 PAGE_SIZE 为 4096 时,这会转换为物理地址 0x00A4DDC0。我们怀疑我们的几个内核驱动程序并进一步调查。有没有更好的想法(比如放置硬件观察点)可以更有效?下面建议的 KASAN 怎么样?

任何帮助表示赞赏。谢谢。


1.) 文本段是RO,但权限可以通过以下方式更改mprotect http://man7.org/linux/man-pages/man2/mprotect.2.html,你可以检查一下你是否认为这是可能的

2.) 如果是内核问题:

  • 运行内核KASAN https://www.kernel.org/doc/Documentation/kasan.txt和 KUBSAN(未定义行为)消毒剂
  • 重点关注未包含在主线中的驱动程序代码
  • 这里的提示是一字节损坏。也许我错了,但这意味着 DMA 不应该受到指责。它看起来像是某种无效的商店。

3.) 硬件。我认为,您的问题看起来像是硬件问题(RAM 问题)。

  • 您可以尝试在引导加载程序中降低 RAM 系统频率
  • 检查此问题是否在稳定的主线软件上重现,这就是您可以证明问题所在的方法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

调试严重的 SIGILL 崩溃:文本段损坏 的相关文章

  • 更改 WinForms 按钮突出显示颜色

    I found 这一页 https stackoverflow com questions 9260303 how to change menu hover color winforms 其中概述了如何更改 MenuStrip 及其项目的呈
  • 为什么 C++ Concepts TS 中同时存在变量和函数概念?

    我一直在看 C 1zN4377 http www open std org jtc1 sc22 wg21 docs papers 2015 n4377 pdfGCC 6 中正在实现的概念 TS 草案 我不明白拥有两种不同概念的目的 变量概念
  • 为什么仍然需要在 using 语句的 RHS 中使用 typename 来消除依赖类型的歧义?

    我很清楚为什么需要使用typename对于依赖类型 因为编译器在看到类似的内容时可能无法消除类型和变量声明之间的歧义T type 参见例如这个答案 https stackoverflow com a 613132 3093378一个很好的解
  • Windows 控制台中的 C++ 按键输入

    我目前正在开发各种consoleWindows 中的游戏无法通过常规输入真正运行cin 我怎样才能 以简单的方式仅使用 MSVC 中提供的标准 Windows 库 让程序等待 特定 按键并返回按键 ID 它必须适用于包括箭头键在内的所有按键
  • ReportViewer“缺少 URL 参数:名称”

    在一个网络应用程序中 我正在处理 ReportViewer 时不断出现错误 缺少 URL 参数 名称 我找到了原因 但没有找到解决方案 导致报告查看器出现异常的 url Reserved ReportViewerWebControl axd
  • 如何将整个流读入 std::string ?

    我正在尝试将整个流 多行 读入字符串中 我正在使用这段代码 它有效 但它冒犯了我的风格感 当然有更简单的方法吗 也许使用字符串流 void Obj loadFromStream std istream stream std string s
  • C 中经过的时间

    include
  • 无效的跨线程访问问题

    我有两个 ViewModel 类 PersonViewModel 和 PersonSearchListViewModel PersonViewModel 实现的字段之一是通过 WCF 下载的个人资料图像 本地缓存在独立存储中 PersonS
  • 树结构的序列化/反序列化

    我试图找出保存 序列化 并稍后打开 反序列化 树结构的最佳方法 我的结构由具有不同属性的各种对象类型组成 但每个对象类型都继承自基本抽象 Node 类 每个节点都有唯一的 ID GUID 并且有一个 AddSuperNode Node nd
  • 如何在 Datagridview 中为图像列提供超链接

    如何在winforms中超链接到DataGridViewImageColumn OP 评论中的代码示例 DataGridView dgv new DataGridView dgv Name dgv i dgv DataSource dsMa
  • 最佳实践:从属性中抛出异常

    什么时候适合从属性 getter 或 setter 中抛出异常 什么时候不合适呢 为什么 关于这个主题的外部文档的链接会很有帮助 谷歌搜索结果出奇的少 Microsoft 在以下位置提供了有关如何设计属性的建议 http msdn micr
  • 使用指针隐藏实现(Pimpl 惯用语)

    是否有可能实现以下目标 x hpp 该文件被许多其他类包含 class x impl forward declare class x public methods private x impl impl x cpp 实施 include
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • 让 AutoMapper 自动映射前缀属性

    我希望 AutoMapper 自动映射成员 如下所示 class Model public int ModelId get set class ModelDto public int Id get set 在这里 我会做一个 CreateM
  • 如何使用 Xamarin 应用程序开发自动注销

    我必须在 App xaml cs 上添加功能才能使其正常工作 我在 OnStart 上添加了功能 但现在它会间歇性地一次又一次地将我从应用程序中注销 根据下面的代码 我需要做什么才能让它停止这样做 或者我的代码有问题 这是我最新的代码 na
  • 类型“MyApp”已包含“MystatusBar”的定义

    我的应用程序 XAML
  • C# 中 WinForm TextBox 中数字的按键事件

    我想限制用户在文本框中仅输入数字 我在按键事件中添加此代码 private void txtPartID KeyPress object sender KeyPressEventArgs e if e KeyChar gt 0 e KeyC
  • 在源代码和预编译二进制文件之间切换

    我们的应用程序中有大量的库 库是用 C 或 C 编写的 平台 net Framework Windows 64 位 将所有内容编译为源代码需要花费大量时间 我们正在考虑切换到预构建的二进制文件 但我们仍然希望保留返回源代码的可能性 作为版本
  • Bazel:为 cc_binary/cc_test 设置运行时环境变量和配置文件位置

    我正在尝试在 Linux 上的 C 应用程序中使用 odbc 以下构建文件用于将库作为外部依赖项包含在内 licenses notice cc library name lib srcs lib libodbc so lib64 libod
  • 如何包装实体框架以在执行前拦截 LINQ 表达式?

    我想在执行之前重写 LINQ 表达式的某些部分 我在将重写器注入正确的位置时遇到问题 实际上根本没有 查看实体框架源代码 在反射器中 它最终归结为IQueryProvider Execute在 EF 中 它通过以下方式耦合到表达式Objec

随机推荐