# Copyright 2017-2020 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 . # When debugging with "target remote |", the inferior's output is # connected to a pipe, and if GDB doesn't flush the pipe while the # inferior is running and the pipe becomes full, then the inferior # deadlocks: # # 1. User sets breakpoint, and types "continue" # # 2. Inferior prints to stdout/stderr before reaching breakpoint # location. # # 3. The output pipe becomes full, so the inferior blocks forever in # the printf/write call. # # 4. The breakpoint is never reached. if [target_info exists gdb,noinferiorio] { verbose "Skipping because of noinferiorio." return } standard_testfile if [prepare_for_testing "failed to prepare" $testfile {} {debug}] { return -1 } if { ![runto_main] } then { fail "run to main" return } set printing_done_line [gdb_get_line_number "printing done"] gdb_test "break $printing_done_line" ".*" "set breakpoint after printing" send_gdb "continue\n" set expected_lines 3000 set more 1 set i 0 while {$more} { set more 0 gdb_expect { -i $inferior_spawn_id -ex "this is line number $i" { incr i if {$i != $expected_lines} { set more 1 } } } } gdb_assert {$i == $expected_lines} "saw all lines" set test "breakpoint reached" gdb_test_multiple "" $test { -re "Breakpoint .* main .*$srcfile:$printing_done_line.*$gdb_prompt $" { pass $test } }