gpt4 book ai didi

c++ - 调试讨厌的 SIGILL 崩溃 : Text Segment corruption

转载 作者:IT王子 更新时间:2023-10-29 00:33:36 27 4
gpt4 key购买 nike

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

一些信息:
Linux 3.12.19-rt30 #1 SMP Fri Mar 11 01:31:24 IST 2016 ppc64 GNU/Linux

(gdb) BT
xxx 中的 0 0x10457dc0

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

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

(gdb) 维护信息部分
0x10006c60->0x00006c60 处的 0x106cecac:.text ALLOC LOAD READONLY 代码有_CONTENTS

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

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

编辑:
我们掌握的一个线索是损坏总是发生在以 0xdc0 结尾的偏移处。
例如
错误指令地址:0x10653dc0 << 在捕获 SIGILL 后由我们的应用程序打印
错误指令地址:0x1000ddc0 << 在捕获 SIGILL 后由我们的应用程序打印
flash_erase[8557]:0fed6dc0 nip 0fed6dc0 lr 0fed6dac 代码 30001 处未处理的信号 4
nandwrite[8561]:0fed6dc0 nip 0fed6dc0 lr 0fed6dac 代码 30001 处未处理的信号 4
awk[4448]:0fe09dc0 nip 0fe09dc0 lr 0fe09dbc 代码 30001 处未处理的信号 4
awk[16002]:0fe09dc0 nip 0fe09dc0 lr 0fe09dbc 代码 30001 处未处理的信号 4
getStats[20670]:0fecfdc0 nip 0fecfdc0 lr 0fecfdbc 代码 30001 处未处理的信号 4
expr[27923]:0fe74dc0 nip 0fe74dc0 lr 0fe74dc0 代码 30001 处未处理的信号 4

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

感谢任何帮助。谢谢。

最佳答案

1.) 文本段是 RO,但可以通过 mprotect 更改权限,你可以检查一下,如果你认为这是可能的

2.) 如果是内核问题:

  • 使用 KASAN 运行内核和 KUBSAN(未定义行为) sanitizer
  • 关注未包含在主线中的驱动程序代码
  • 这里的提示是一个字节损坏。也许我错了,但这意味着 DMA 不应该受到指责。它看起来像是某种无效的商店。

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

  • 您可以尝试在引导加载程序中降低 RAM 系统频率
  • 检查此问题是否在稳定的主线软件上重现,这就是您如何证明问题所在

关于c++ - 调试讨厌的 SIGILL 崩溃 : Text Segment corruption,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39010931/

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