【问题标题】:Can signal 11 be raised at a mov instruction from register to register?可以在从寄存器到寄存器的 mov 指令中引发信号 11 吗?
【发布时间】:2013-03-05 17:05:02
【问题描述】:

我从使用 gdb 分析的核心转储中获得了以下反汇编代码。

   0x083dc366 <+194>:   call   0x83db38e <Buf::push_data(UBYTE const*, UWORD)>  
=> 0x083dc36b <+199>:   mov    eax,esi  
   0x083dc36d <+201>:   mov    edx,DWORD PTR [ebp-0x1c]

是否有可能在第一个 mov 指令时崩溃或 gdb 中的小箭头不可信?

【问题讨论】:

  • 您可能不在最内层框架中,并且在 push_data 中发生了段错误。检查 $_siginfo 或类似的以获取真实的代码位置。
  • 谢谢@PlasmaHH,您再次回答了我的一个问题。

标签: c++ assembly x86 gdb segmentation-fault


【解决方案1】:

它可能在该特定指令上崩溃的唯一方式是内存不可执行(例如,跳转到恰好解码为mov的数据字节)。由于它似乎来自正确的代码部分,因此在这种情况下不太可能。

我怀疑 GDB 只是向您展示了函数调用返回的地方,而实际崩溃发生在被调用函数内部。也许它无法访问函数的代码或出于其他原因决定切换堆栈帧。使用bt 检查完整的堆栈跟踪,并在必要时使用frame #n 切换帧。

在极端情况下,转储本身可能已损坏并包含错误信息。如果您可以可靠地重现崩溃,最好从一开始就在 GDB 下运行程序,并在崩溃发生时立即捕获崩溃,以免损坏任何东西。

【讨论】:

  • 就是这样,我不在最内框,非常感谢您的回答。
【解决方案2】:

没有。

两个寄存器之间的移动不应导致分段错误,因为寄存器不存储在内存中,而是在 CPU 上具有特殊位置。 gdb 中的箭头不显示当前行,它显示的是指令指针的当前值,或者要运行的下一条指令,但之前的行可能尚未执行,因此它可能是崩溃的根源。

【讨论】:

    【解决方案3】:

    是否有可能在第一个 mov 指令时崩溃

    没有。

    否则来自 gdb 的小箭头不可信

    箭头应该是可信的。

    您拥有“无意义”数据的最可能原因是:您重建了可执行文件,或者您向 GDB 提供了错误的可执行文件,因此崩溃的可执行文件在 0x083dc36b 处具有 不同 指令来自您指向 GDB 的可执行文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 2011-05-04
      • 2019-09-12
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多