GDB有一个支持反向调试的新版本(参见http://www.gnu.org/software/gdb/news/reversible.html).我想知道它是如何工作的.
为了使反向调试工作,在我看来,您需要存储整个机器状态,包括每个步骤的内存.这会使性能变得非常慢,更不用说使用大量内存了.这些问题是如何解决的?
我正在尝试在多线程项目(使用libevent)上使用gdb 7.3.1的反向调试功能,但是我收到以下错误:
(gdb) reverse-step
Target multi-thread does not support this command.
Run Code Online (Sandbox Code Playgroud)
从这个问题,我想也许加载libthread_db是一个问题但是,当我运行程序时,gdb说:
Starting program: /home/robb/slug/slug
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
Run Code Online (Sandbox Code Playgroud)
如何在多线程项目中使用gdb 7.3.1启用反向调试?可能吗?
有没有人真正使用过可逆调试器?谷歌出现的唯一产品是UndoDB.它显然仅适用于Linux.
你可能熟悉
他们都宣称自己是"Java DVR" - 是否有任何开源实现提供类似(甚至是他们的一部分)功能?
有没有人尝试在新发布的gdb-7.0中使用新的记录/重放和反向调试功能?我是gdb开发人员/维护人员之一,我非常渴望获得用户反馈!
(编辑:根据当前"技巧"下面的第一个答案似乎是使用Atom处理器.但我希望一些gdb专家可以回答,如果这是一个基本的限制,或者是否在路线图上增加了对其他处理器的支持?)
反向执行似乎在我的环境中工作:我可以反向继续,查看合理的记录日志,并在其中移动:
(gdb) start
...Temporary breakpoint 5 at 0x8048460: file bang.cpp, line 13.
Starting program: /home/thomasg/temp/./bang
Temporary breakpoint 5, main () at bang.cpp:13
13 f(1000);
(gdb) record
(gdb) continue
Continuing.
Breakpoint 3, f (d=900) at bang.cpp:5
5 if(d) {
(gdb) info record
Active record target: record-full
Record mode:
Lowest recorded instruction number is 1.
Highest recorded instruction number is 1005.
Log contains 1005 instructions.
Max logged instructions is 200000.
(gdb) reverse-continue
Continuing.
Breakpoint 3, f (d=901) at bang.cpp:5
5 if(d) …Run Code Online (Sandbox Code Playgroud) 我已经阅读了本教程,但我还没有找到任何关于反向调试的内容.lldb是否有像target recordgdb 一样的功能?如果是,我在哪里可以阅读它?
我开始尝试使用gdb 7进行反向调试,按照教程:
http://www.sourceware.org/gdb/wiki/ProcessRecord/Tutorial
Run Code Online (Sandbox Code Playgroud)
我想,太好了!
然后我开始调试一个真正的程序,最后给出一个错误.所以我用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
Run Code Online (Sandbox Code Playgroud)
在我详细介绍之前,我想知道这个功能是否还有错误,或者我是否应该从头开始录制.
发生此"记录"错误的地方,只创建一个对象作为其他对象的副本.
我在gdb(版本7.1)中收到以下消息:
[Thread debugging using libthread_db enabled]
和命令 reverse-step
结果出现以下错误消息:
(gdb) reverse-step
Target multi-thread does not support this command
Run Code Online (Sandbox Code Playgroud)
我正在调试一个串行代码,所以我绝对不需要多线程.我可以以某种方式关闭它,以便我获得最新的反向调试命令吗?此外,如果代码与OpenMPI并行化,则根本不需要多线程调试,对吧?
编辑:这是否设置为可以被排除的编译标志?