信号11能在一个mov指令中从一个寄存器被激发到另一个寄存器吗?

Can signal 11 be raised at a mov instruction from register to register?

本文关键字:寄存器 一个 另一个 指令 mov 信号      更新时间:2023-10-16

我用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的小箭头是不可信的?

唯一可能在特定指令上崩溃的方式是如果内存不可执行(例如跳转到碰巧解码为mov的数据字节)。因为它似乎来自一个适当的代码节,所以在这种情况下不太可能。

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

在极端情况下,转储本身可能被损坏并包含坏信息。如果您可以可靠地重现崩溃,那么最好从一开始就在GDB下运行程序,并在崩溃发生时及时捕获崩溃,以免它有机会破坏任何东西。

NO.

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

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

或者来自GDB的小箭头是不可信的

箭头应该是可信的。

最有可能的原因是你有"无意义"的数据:你重新构建了可执行文件,或者你给了错误的可执行文件给GDB,所以崩溃的可执行文件在0x083dc36b有一个不同的指令,从你指向GDB的可执行文件。