liaozhicai 2024-06-13 10:58 采纳率: 20%
浏览 4

ld函数出现sigill怎么查

抓到了sigill信号:
[18:26:086]sno:4 Fault address:0 s-code:128 eno:0
[18:26:303]/lib/libc.so.6(+0x34b1a160) [0x77442160]
[18:26:304]linux-vdso.so.1(+0x920) [0x7ff97920]
[18:26:304]/usr/bin/MecMgr(__libc_csu_init+0xa2) [0x556bd002]
mips32架构,指令都是固定4字节长度,怎么跑到0xa2(162)去了?会有哪些原因?

Dump of assembler code for function __libc_csu_init:
   0x555d3f60 <+0>:     lui     gp,0x3
   0x555d3f64 <+4>:     addiu   gp,gp,-24288
   0x555d3f68 <+8>:     addu    gp,gp,t9
   0x555d3f6c <+12>:    addiu   sp,sp,-56
   0x555d3f70 <+16>:    sw      ra,52(sp)
   0x555d3f74 <+20>:    sw      s5,48(sp)
   0x555d3f78 <+24>:    sw      s4,44(sp)
   0x555d3f7c <+28>:    sw      s3,40(sp)
   0x555d3f80 <+32>:    sw      s2,36(sp)
   0x555d3f84 <+36>:    sw      s1,32(sp)
   0x555d3f88 <+40>:    sw      s0,28(sp)
=> 0x555d3f8c <+44>:    move    s3,a0
   0x555d3f90 <+48>:    lw      t9,-29668(gp)
   0x555d3f94 <+52>:    move    s4,a1
   0x555d3f98 <+56>:    sw      gp,16(sp)
   0x555d3f9c <+60>:    jalr    t9
   0x555d3fa0 <+64>:    move    s5,a2
   0x555d3fa4 <+68>:    lw      gp,16(sp)
   0x555d3fa8 <+72>:    lw      s0,-29664(gp)
   0x555d3fac <+76>:    lw      s2,-29660(gp)
   0x555d3fb0 <+80>:    subu    s2,s2,s0
   0x555d3fb4 <+84>:    sra     s2,s2,0x2
--Type <RET> for more, q to quit, c to continue without paging--
   0x555d3fb8 <+88>:    beqz    s2,0x555d3fe4 <__libc_csu_init+132>
   0x555d3fbc <+92>:    move    s1,zero
   0x555d3fc0 <+96>:    lw      t9,0(s0)
   0x555d3fc4 <+100>:   move    a2,s5
   0x555d3fc8 <+104>:   move    a1,s4
   0x555d3fcc <+108>:   addiu   s1,s1,1
   0x555d3fd0 <+112>:   move    a0,s3
   0x555d3fd4 <+116>:   jalr    t9
   0x555d3fd8 <+120>:   addiu   s0,s0,4
   0x555d3fdc <+124>:   bne     s2,s1,0x555d3fc0 <__libc_csu_init+96>
   0x555d3fe0 <+128>:   nop
   0x555d3fe4 <+132>:   lw      ra,52(sp)
   0x555d3fe8 <+136>:   lw      s5,48(sp)
   0x555d3fec <+140>:   lw      s4,44(sp)
   0x555d3ff0 <+144>:   lw      s3,40(sp)
   0x555d3ff4 <+148>:   lw      s2,36(sp)
   0x555d3ff8 <+152>:   lw      s1,32(sp)
   0x555d3ffc <+156>:   lw      s0,28(sp)
   0x555d4000 <+160>:   jr      ra
   0x555d4004 <+164>:   addiu   sp,sp,56

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-06-13 10:58
    关注

    引自免费微信小程序:皆我百晓生

    遇到SIGILL信号通常意味着程序执行了非法指令,这可能是由于硬件不支持该指令、指令格式错误或数据被当作指令执行等情况导致的。在MIPS32架构中,每条指令固定为4字节长,因此地址0xa2(即162)指向的应该是指令流中的某条指令。

    从提供的反汇编代码来看,当执行到move s3, a0这一行时(地址0x555d3f8c),系统抛出了SIGILL信号。这可能是因为在此指令或其后的指令中存在某种错误。具体原因可能包括但不限于以下几点:

    1. 内存错误0xa2处的内存可能已经被破坏,例如,该位置原本存储的数据被误写,导致读取时得到的不是有效的指令。

    2. 缓存一致性问题:如果系统使用了多级缓存,可能在某一缓存层级中该指令的副本已经过期或被污染,但CPU尝试从该层级执行指令。

    3. 硬件故障:虽然概率较低,但也不排除是硬件层面的问题,比如CPU内部电路损坏导致无法正确解析或执行某些指令。

    4. 编译器或链接器错误:编译过程中可能出现错误,如指令编码不正确,或者链接时某些段未正确对齐,导致指令地址计算错误。

    为了定位具体问题,可以尝试以下步骤:

    步骤1:检查编译和链接设置

    确认编译和链接选项是否正确,尤其是对于MIPS这样的RISC架构,确保使用了正确的编译器和目标架构设置。例如:

    • 使用-march=mips32等标志指定目标架构。
    • 确保没有使用未被硬件支持的扩展指令集。

    步骤2:审查源代码

    检查与__libc_csu_init相关的源代码部分,确认没有逻辑错误,特别是涉及指针操作和内存访问的部分。

    步骤3:调试和日志记录

    使用调试器(如GDB)设置断点在__libc_csu_init函数入口处,观察进入该函数前后的寄存器和内存状态,以及执行过程中的变化。注意查看异常发生时的上下文信息,如指令指针、栈指针等。

    步骤4:内存检查

    利用调试工具检查0xa2附近的内存区域,确认这些地址上的数据是否符合预期的指令格式。可以使用类似x/16i $pc的命令查看PC周围的指令。

    步骤5:硬件诊断

    如果上述软件层面的排查未能找到原因,可能需要进行更深入的硬件诊断,检查CPU及其缓存、内存模块等硬件组件是否正常工作。

    通过以上步骤,应该能逐步缩小问题范围,最终定位并解决导致SIGILL的根本原因。如果在特定环境下重复触发此问题,收集详细的错误日志和系统配置信息也将非常有帮助。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月13日