Index: ChangeLog =================================================================== RCS file: /cvs/src/src/gdb/ChangeLog,v retrieving revision 1.14894 diff -u -r1.14894 ChangeLog --- ChangeLog 9 Dec 2012 18:39:57 -0000 1.14894 +++ ChangeLog 11 Dec 2012 15:26:11 -0000 @@ -1,3 +1,9 @@ +2012-12-10 Ali Anwar + + PR threads/13217 + * thread.c (thread_apply_all_command): Check for valid threads + and thread count. + 2012-12-09 Jan Kratochvil * configure.ac (CC_HAS_LONG_LONG): Replace by AC_MSG_ERROR. Index: thread.c =================================================================== RCS file: /cvs/src/src/gdb/thread.c,v retrieving revision 1.149 diff -u -r1.149 thread.c --- thread.c 27 Jul 2012 00:52:36 -0000 1.149 +++ thread.c 11 Dec 2012 15:31:52 -0000 @@ -1178,7 +1178,6 @@ static void thread_apply_all_command (char *cmd, int from_tty) { - struct thread_info *tp; struct cleanup *old_chain; char *saved_cmd; @@ -1193,18 +1192,32 @@ execute_command. */ saved_cmd = xstrdup (cmd); make_cleanup (xfree, saved_cmd); - for (tp = thread_list; tp; tp = tp->next) - if (thread_alive (tp)) - { - switch_to_thread (tp->ptid); - - printf_filtered (_("\nThread %d (%s):\n"), - tp->num, target_pid_to_str (inferior_ptid)); - execute_command (cmd, from_tty); - strcpy (cmd, saved_cmd); /* Restore exact command used - previously. */ - } + if (thread_count ()) + { + struct thread_info *tp_array; + struct thread_info *tp; + int i, k; + + /* Save a copy of the thread_list in case we execute detach + command. */ + tp_array = xmalloc (sizeof (struct thread_info) * thread_count ()); + for (i = 0, tp = thread_list; tp; i++, tp = tp->next) + tp_array[i] = *tp; + + for (k = 0; k != i; k++) + if (thread_alive (&tp_array[k])) + { + switch_to_thread ((&tp_array[k])->ptid); + + printf_filtered (_("\nThread %d (%s):\n"), + (&tp_array[k])->num, target_pid_to_str (inferior_ptid)); + execute_command (cmd, from_tty); + strcpy (cmd, saved_cmd); /* Restore exact command used + previously. */ + } + xfree (tp_array); + } do_cleanups (old_chain); } Index: testsuite/gdb.threads/threadapply.exp =================================================================== RCS file: /cvs/src/src/gdb/testsuite/gdb.threads/threadapply.exp,v retrieving revision 1.15 diff -u -r1.15 threadapply.exp --- testsuite/gdb.threads/threadapply.exp 26 Jun 2012 19:23:20 -0000 1.15 +++ testsuite/gdb.threads/threadapply.exp 11 Dec 2012 15:26:20 -0000 @@ -63,3 +63,4 @@ gdb_test "up" ".*in main.*" "go up in the stack frame" gdb_test "thread apply all print 1" "Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1.*Thread ..*\\\$\[0-9]+ = 1" "run a simple print command on all threads" gdb_test "down" "#0.*thread_function.*" "go down and check selected frame" +gdb_test "thread apply all detach" "Detaching from.*" "detach all threads"