This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch] Fix for MI selecting an exited thread


Hi,

Eclipse is sometimes hitting what I feel is a GDB/MI bug.
When trying to resume an entire inferior in all-stop,
GDB can end up selecting a thread that does not exist anymore.

The below session shows a program that starts a second thread
that exists immediately.  Then, I interrupt the inferior with ^C
and try to resume it using an MI command.  Because I don't specify
an actual thread but the entire process (thread-group), MI randomly 
chooses a thread to use, in this case, the exited thread.

I suggest that MI should only choose a live thread when randomly
selecting one.  The below patch does this with no regressions.

Ok?


Session showing the bug:
=======================
> gdb.7.5 a.out
GNU gdb (GDB) 7.4.50.20120420-cvs
(gdb) l
1       #include <pthread.h>
2
3       void* run(void* arg) { return 0; }
4
5       int main(int argc, char** argv) {
6          pthread_t tid;
7          pthread_create(&tid, NULL, &run, NULL);
8          while(1) { }
9       }
(gdb) r
Starting program: /home/lmckhou/testing/a.out 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
[New Thread 0xb7fe5b70 (LWP 4645)]
[Thread 0xb7fe5b70 (LWP 4645) exited]
^C
Program received signal SIGINT, Interrupt.
main (argc=1, argv=0xbffff794) at hello.cpp:8
8          while(1) { }
(gdb) interpreter-exec mi "-exec-continue --thread-group i1"
^error,msg="Cannot execute this command without a live selected thread."

(gdb) inf thr
  Id   Target Id         Frame 
  1    Thread 0xb7fe7b30 (LWP 4641) main (argc=1, argv=0xbffff794) at hello.cpp:8
The current thread <Thread ID 2> has terminated.  See `help thread'.


Patch:
=====
2012-04-20  Marc Khouzam  <marc.khouzam@ericsson.com>
 
	* mi/mi-main.c (mi_cmd_execute): Choose a live thread not just
	any thread.

### Eclipse Workspace Patch 1.0
#P src
Index: gdb/mi/mi-main.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-main.c,v
retrieving revision 1.215
diff -u -r1.215 mi-main.c
--- gdb/mi/mi-main.c    27 Mar 2012 19:08:37 -0000      1.215
+++ gdb/mi/mi-main.c    20 Apr 2012 19:47:35 -0000
@@ -2066,7 +2066,7 @@
         provide --thread if it wishes to operate on a specific
         thread.  */
       if (inf->pid != 0)
-       tp = any_thread_of_process (inf->pid);
+       tp = any_live_thread_of_process (inf->pid);
       switch_to_thread (tp ? tp->ptid : null_ptid);
       set_current_program_space (inf->pspace);
     }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]