# Copyright (C) 2007, 2009, 2010 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 . # This file was written by Chris Demetriou (cgd@google.com). # It tests printing of thread event (start, exit) information, and # disabling of those messages. # # Note: the format of thread event messages (and also whether or not # messages are printed and can be disabled) is dependent on the target # thread support code. # This test has only been verified with Linux targets, and would need # to be generalized to support other targets if ![istarget *-*-linux*] then { return } # When using gdbserver, even on Linux, we don't get notifications # about new threads. This is expected, so don't test for that. if [is_remote target] then { return } if $tracelevel then { strace $tracelevel } set testfile "thread_events" set srcfile ${testfile}.c set binfile ${objdir}/${subdir}/${testfile} if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug "incdir=${objdir}"]] != "" } { return -1 } proc gdb_test_thread_start {messages_enabled command pattern message} { global gdb_prompt if { $messages_enabled } { set events_expected 1 } else { set events_expected 0 } set events_seen 0 return [gdb_test_multiple $command $message { -re "\\\[New Thread \[^\]\]*\\\]\r\n" { incr events_seen; exp_continue; } -re "\[\r\n\]*($pattern)\[\r\n\]+$gdb_prompt $" { if { $events_seen != $events_expected } { fail "$message (saw $events_seen, expected $events_expected)" } else { pass "$message" } } }] } proc gdb_test_thread_exit {messages_enabled command pattern message} { global gdb_prompt if { $messages_enabled } { set events_expected 1 } else { set events_expected 0 } set events_seen 0 return [gdb_test_multiple $command $message { -re "\\\[Thread \[^\]\]* exited\\\]\r\n" { incr events_seen exp_continue; } -re "\[\r\n\]*($pattern)\[\r\n\]+$gdb_prompt $" { if { $events_seen != $events_expected } { fail "$message (saw $events_seen, expected $events_expected)" } else { pass "$message" } } }] } proc test_thread_messages {enabled} { global srcdir subdir binfile srcfile if { $enabled } { set enabled_string "with messages enabled" } else { set enabled_string "with messages disabled" } gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load ${binfile} if { $enabled } { gdb_test "set print thread-events on" } else { gdb_test "set print thread-events off" } # The initial thread may log a 'New Thread' message, but we don't # check for it. if ![runto_main] then { fail "Can't run to main $enabled_string" return 1 } gdb_test "break threadfunc" \ "Breakpoint.*at.* file .*$srcfile, line.*" \ "breakpoint at threadfunc $enabled_string" gdb_test "break after_join_func" \ "Breakpoint.*at.* file .*$srcfile, line.*" \ "breakpoint at after_join_func $enabled_string" # continue to threadfunc breakpoint. A thread will start. # Expect to see a thread start message, if messages are enabled. gdb_test_thread_start $enabled "continue" \ ".*Breakpoint .*,.*threadfunc.*at.*$srcfile:.*" \ "continue to threadfunc $enabled_string" # continue to after_join_func breakpoint. A thread will exit. # Expect to see a thread exit message, if messages are enabled. gdb_test_thread_exit $enabled "continue" \ ".*Breakpoint .*,.*after_join_func.*at.*$srcfile:.*" \ "continue to after_join_func $enabled_string" delete_breakpoints gdb_exit } test_thread_messages 0 test_thread_messages 1