| # Copyright (C) 2009-2012 Free Software Foundation, Inc. |
| |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 3 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| |
| # Test that GDB doesn't get stuck when thread hoping over a thread |
| # specific breakpoint when the selected thread has gone away. |
| |
| set testfile "threxit-hop-specific" |
| set srcfile ${testfile}.c |
| set binfile ${objdir}/${subdir}/${testfile} |
| |
| if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" \ |
| executable [list debug "incdir=${objdir}"]] != "" } { |
| return -1 |
| } |
| |
| # Start with a fresh gdb. |
| |
| gdb_exit |
| gdb_start |
| gdb_reinitialize_dir $srcdir/$subdir |
| |
| gdb_load ${binfile} |
| |
| runto_main |
| |
| # Get ourselves to the thread that exits |
| gdb_breakpoint "thread_function" |
| gdb_test "continue" ".*thread_function.*" "continue to thread start" |
| |
| # Set a thread specific breakpoint somewhere the main thread will pass |
| # by, but make it specific to the thread that is going to exit. Step |
| # over the pthread_exit call. GDB should still be able to step over |
| # the thread specific breakpoint, and reach the other breakpoint, |
| # which is not thread specific. |
| set bpthrline [gdb_get_line_number "set thread specific breakpoint here"] |
| gdb_test "break $bpthrline thread 2" \ |
| "Breakpoint .*$srcfile.*$bpthrline.*" \ |
| "set thread specific breakpoint" |
| |
| set bpexitline [gdb_get_line_number "set exit breakpoint here"] |
| gdb_breakpoint "$bpexitline" |
| |
| gdb_test "continue" \ |
| ".*set exit breakpoint here.*" \ |
| "get past the thread specific breakpoint" |
| |
| return 0 |