草庐IT

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

coder 2023-06-18 原文

我们的是基于 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/

有关c++ - 调试讨厌的 SIGILL 崩溃 : Text Segment corruption的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  4. ruby-on-rails - 无法让 rspec、spork 和调试器正常运行 - 2

    GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'

  5. ruby - JetBrains RubyMine 3.2.4 调试器不工作 - 2

    使用Ruby1.9.2运行IDE提示说需要gemruby​​-debug-base19x并提供安装它。但是,在尝试安装它时会显示消息Failedtoinstallgems.Followinggemswerenotinstalled:C:/ProgramFiles(x86)/JetBrains/RubyMine3.2.4/rb/gems/ruby-debug-base19x-0.11.30.pre2.gem:Errorinstallingruby-debug-base19x-0.11.30.pre2.gem:The'linecache19'nativegemrequiresinstall

  6. ruby-on-rails - 如何调试 cucumber 测试? - 2

    我有:When/^(?:|I)follow"([^"]*)"(?:within"([^"]*)")?$/do|link,selector|with_scope(selector)doclick_link(link)endend我打电话的地方:Background:GivenIamanexistingadminuserWhenIfollow"CLIENTS"我的HTML是这样的:CLIENTS我一直收到这个错误:.F-.F--U-----U(::)failedsteps(::)nolinkwithtitle,idortext'CLIENTS'found(Capybara::Element

  7. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  8. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  9. ruby - Ruby 是否有类似于 Perl 的 "perl -d"的逐步调试器? - 2

    Ruby是否有逐步调试器,类似于Perl的“perl-d”? 最佳答案 ruby-debug(对于ruby1.8),debugger(对于ruby1.9),byebug(对于ruby​​2.0)以及trepanning系列都有一个-x或--trace选项。在调试器内部,命令setlinetrace将打开或关闭线路跟踪。这是themanualforruby-debug原来的答案已经修改,因为数据噪声文章的链接,唉,不再有效了。还添加了ruby​​-debug的后继者 关于ruby-Ruby

  10. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

随机推荐