信号11能在一个mov指令中从一个寄存器被激发到另一个寄存器吗?
Can signal 11 be raised at a mov instruction from register to register?
我用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的可执行文件。
相关文章:
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 全局变量 多读取器 一个写入器多线程安全?
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- Atmel Studio:返回一个包含数组的寄存器
- 使用 googletest 测试嵌入式C++代码时处理外设寄存器的重复符号
- 移位寄存器74HC595输出电流
- 使用 Windows 寄存器查找下一个"Daylight Saving Time"
- 为什么 MSVC 在寄存器中返回一个小结构时不必要地使用堆栈
- RegQueryValueEx返回另一个寄存器的值的奇怪行为
- 信号11能在一个mov指令中从一个寄存器被激发到另一个寄存器吗?
- 在LLVM中实现一个寄存器分配器