我从使用 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 中的小箭头不可信?
我从使用 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 下运行程序,并在崩溃发生时立即捕获崩溃,以免它有机会损坏任何东西。
两个寄存器之间的移动不应导致分段错误,因为寄存器不存储在内存中,而是在 CPU 上具有特殊位置。gdb 中的箭头不是显示当前行,而是显示指令指针的当前值,或者要运行的下一条指令,但之前的行可能尚未执行,因此它可能是崩溃的根源。
是否有可能在第一个 mov 指令时崩溃
不。
或者来自 gdb 的小箭头不可信
箭头应该是可信的。
您拥有“无意义”数据的最可能原因是:您重建了可执行文件,或者您向 GDB 提供了错误的可执行文件,因此崩溃的可执行文件与您指向 GDB 的可执行文件具有不同的指令。0x083dc36b