我们的是基于 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 怎么样?
感谢任何帮助。谢谢。
+84>+80>最佳答案
1.) 文本段是 RO,但可以通过 mprotect 更改权限,你可以检查一下,如果你认为这是可能的
2.) 如果是内核问题:
3.) 硬件。我认为,您的问题看起来像是硬件问题(RAM 问题)。
关于c++ - 调试讨厌的 SIGILL 崩溃 : Text Segment corruption,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39010931/
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
当我在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)(人们推荐的最少
GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'
使用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
我有: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
如何将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.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
Ruby是否有逐步调试器,类似于Perl的“perl-d”? 最佳答案 ruby-debug(对于ruby1.8),debugger(对于ruby1.9),byebug(对于ruby2.0)以及trepanning系列都有一个-x或--trace选项。在调试器内部,命令setlinetrace将打开或关闭线路跟踪。这是themanualforruby-debug原来的答案已经修改,因为数据噪声文章的链接,唉,不再有效了。还添加了ruby-debug的后继者 关于ruby-Ruby
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么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”]、[“苹果”、“