Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I enable reverse debugging on a multi-threaded program?

I'm trying to use the reverse debugging features of gdb 7.3.1 on a multi-threaded project (using libevent), but I get the following error:

(gdb) reverse-step Target multi-thread does not support this command. 

From this question, I thought perhaps that it was an issue loading libthread_db but, when I run the program, gdb says:

Starting program: /home/robb/slug/slug  [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/libthread_db.so.1". 

How can I enable reverse debugging with gdb 7.3.1 on a multi-threaded project? Is it possible?

like image 647
rps Avatar asked Sep 22 '11 15:09

rps


People also ask

Why it is difficult to debug multi threaded programs?

Parallel processing using many threads can greatly improve program performance, but it may also make debugging more difficult because you're tracking many threads. Multithreading can introduce new types of potential bugs.

Does multithreading make a program easier to debug?

In case of a single-threaded program, it is easy for the debugger tool to trace the execution path of the single thread that also includes all the validation logic. However, if the software is multithreaded, the task gets tougher, with the difficulty of debugging lying in the core principle of multithreading itself.


1 Answers

To do this, you need to activate the instruction-recording target, by executing the command

record 

from the point where you want to go forward and backward (remember that the recording will significantly slow down the execution, especially if you have several threads!)

I've just checked that it's working correctly:

(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 

...

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

...

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); 
like image 100
Kevin Avatar answered Sep 30 '22 07:09

Kevin