我开始尝试使用 gdb 7 进行反向调试,按照教程进行操作:
http://www.sourceware.org/gdb/wiki/ProcessRecord/Tutorial
我想,太棒了!
然后我开始调试一个真实的程序,最后出现错误。所以我用 gdb 运行它,并在我认为出现错误的地方之前放置了一个断点。然后我输入“record”以开始记录操作以供将来的反向调试。但经过一些步骤后我明白了
Process record doesn't support instruction 0xf0d at address 0x2aaaab4c4b4e.
Process record: failed to record execution log.
Program received signal SIGTRAP, Trace/breakpoint trap.
0x00002aaaab4c4b4e in memcpy () from /lib64/libc.so.6
(gdb) n
Single stepping until exit from function memcpy,
which has no line number information.
Process record doesn't support instruction 0xf0d at address 0x2aaaab4c4b4e.
Process record: failed to record execution log.
Program received signal SIGABRT, Aborted.
0x00002aaaab4c4b4e in memcpy () from /lib64/libc.so.6
在详细看之前,我想知道这个功能是否还有bug,或者我是否应该从头开始记录。
发生此“记录”错误时,只会创建一个对象作为其他对象的副本。
从 GDB 7.11.1 开始,逆向调试不支持 AVX
也许这与以下提到的问题相同:
因为您的跟踪提到了 memcpy,它在 Ubuntu 16.04 中使用 AVX 指令,但如果没有最小的示例,很难确定。
rr
是一个很棒的工作替代方案:https://github.com/mozilla/rr 这是一个最小的工作示例:如何在函数返回的 GDB 中设置断点?
这是因为prec还不支持这个insn。
现已修复。 您可以尝试 gdb-cvs-head。
听起来
precord
仍然有问题。
请确保您使用的是最新发布的 GDB 7.1,并提交错误。
x/i 0x2aaaab4c4b4e
的输出可能会有帮助。 GCC 和 libc.so.6 的确切分布和版本也是如此