Index: gdb/ChangeLog =================================================================== RCS file: /cvs/src/src/gdb/ChangeLog,v retrieving revision 1.14894 diff -u -r1.14894 ChangeLog --- gdb/ChangeLog 9 Dec 2012 18:39:57 -0000 1.14894 +++ gdb/ChangeLog 10 Dec 2012 18:13:27 -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: gdb/thread.c =================================================================== RCS file: /cvs/src/src/gdb/thread.c,v retrieving revision 1.149 diff -u -r1.149 thread.c --- gdb/thread.c 27 Jul 2012 00:52:36 -0000 1.149 +++ gdb/thread.c 10 Dec 2012 18:13:27 -0000 @@ -1174,11 +1174,9 @@ thread apply 1 2 7 4 backtrace Apply backtrace cmd to threads 1,2,7,4 thread apply 2-7 9 p foo(1) Apply p foo(1) cmd to threads 2->7 & 9 thread apply all p x/i $pc Apply x/i $pc cmd to all threads. */ - static void thread_apply_all_command (char *cmd, int from_tty) { - struct thread_info *tp; struct cleanup *old_chain; char *saved_cmd; @@ -1193,18 +1191,30 @@ 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 [thread_count ()]; + struct thread_info *tp; + int i, k; + + /* Save a copy of the thread_list in case we execute detach + command. */ + 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. */ + } + } do_cleanups (old_chain); } Index: gdb/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 --- gdb/testsuite/gdb.threads/threadapply.exp 26 Jun 2012 19:23:20 -0000 1.15 +++ gdb/testsuite/gdb.threads/threadapply.exp 10 Dec 2012 18:13:33 -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"