如何在多线程程序上启用反向调试?

rps*_*rps 30 multithreading gdb reverse-debugging

我正在尝试在多线程项目(使用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启用反向调试?可能吗?

Kev*_*vin 30

为此,您需要通过执行命令来激活指令记录目标

record
Run Code Online (Sandbox Code Playgroud)

从你想要向前和向后的位置开始(请记住,录音会显着减慢执行速度,特别是如果你有多个线程!)

我刚检查它是否正常工作:

(gdb) info threads 
  Id   Target Id         Frame 
  2    Thread 0x7ffff7860700 (LWP 5503) "a.out" hello (arg=0x601030) at test2.c:16
* 1    Thread 0x7ffff7fca700 (LWP 5502) "a.out" main (argc=2, argv=0x7fffffffe2e8) at test2.c:47
Run Code Online (Sandbox Code Playgroud)

...

(gdb) next
49          p[i].id=i;
(gdb) reverse-next
47      for (i=0; i<n; i++)
Run Code Online (Sandbox Code Playgroud)

...

17      printf("Hello from node %d\n", p->id);
(gdb) next
Hello from node 1
18      return (NULL);
(gdb) reverse-next
17      printf("Hello from node %d\n", p->id);
Run Code Online (Sandbox Code Playgroud)

  • 尝试`set non-stop off`和/或`set target-async off`,这些选项在GDB的最新版本中可能是默认的 (6认同)
  • “记录”功能无法正确支持多线程。请参阅 https://sourceware.org/bugzilla/show_bug.cgi?id=20456#c8。 (2认同)