[Patch] Fix for MI selecting an exited thread

Marc Khouzam
2012-04-20T19:57:53Z

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);
}