From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27486 invoked by alias); 27 Feb 2015 10:42:57 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 27473 invoked by uid 89); 27 Feb 2015 10:42:57 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Fri, 27 Feb 2015 10:42:55 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id t1RAgrCj001844 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 27 Feb 2015 05:42:53 -0500 Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.ams2.redhat.com [10.39.146.11]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id t1RAgp53005423; Fri, 27 Feb 2015 05:42:52 -0500 Message-ID: <54F04A2B.5@redhat.com> Date: Fri, 27 Feb 2015 10:42:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.3.0 MIME-Version: 1.0 To: Yao Qi CC: gdb-patches@sourceware.org Subject: Re: [PATCH 5/6] testsuite: Introduce $inferior_spawn_id References: <1424699660-11727-1-git-send-email-palves@redhat.com> <1424699660-11727-6-git-send-email-palves@redhat.com> <867fv7xodw.fsf@gmail.com> In-Reply-To: <867fv7xodw.fsf@gmail.com> Content-Type: multipart/mixed; boundary="------------050800010305030900060905" X-SW-Source: 2015-02/txt/msg00809.txt.bz2 This is a multi-part message in MIME format. --------------050800010305030900060905 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-length: 2663 On 02/24/2015 04:31 PM, Yao Qi wrote: > Pedro Alves writes: > > Hi Pedro, > >> + # GDBserver doesn't do inferior I/O through GDB. But we can >> + # talk to the program using GDBserver's tty instead. >> + global inferior_spawn_id >> + set inferior_spawn_id $server_spawn_id > > Does it still work well if GDBserver is started without tty? In my > remote testing, gdbserver is started without tty, > > spawn /usr/bin/ssh -l yao junor1 /gdbserver/aarch64/gdbserver --once :2346 aarch64-linux-gnu/gdb/testsuite/gdb.base/interrupt > > I see the following timeouts: > > Continuing.^M > Remote debugging from host 10.2.206.34^M > FAIL: gdb.base/interrupt.exp: process is alive (timeout) > a^M > a^M > FAIL: gdb.base/interrupt.exp: child process ate our char (timeout) I tried it now, and the problem is that when the gdbserver/inferior is started without a tty, then stdout is put in unbuffered mode, so the printf calls don't flush... Adding: setvbuf (stdout, NULL, _IONBF, BUFSIZ); to interrupt.c fixes it. This is the same problem we see when testing with Windows (native or remote) from Cygwin, given in that case stdin/stdout is connected to a pipe. Long ago I added the set_unbuffered_mode.c hack to for this. So enabling that hack fixes this too then. See patch below. (I also hacked native-gdbserver.exp locally to use ssh with no -t to test it). That would require boards to set that gdb,force_unbuffered_mode flag if they need it. But I'm not sure we want to expose that to boards. We could also always enable the hack for gdbserver in gdbserver-support.exp. Or we could fix the tests themselves to explicitly call setvbuf if needed and not bother boards at all. I count only around 20 tests that check gdb,noinferiorio, or use gdb_skip_stdio_test, and we could fix them incrementally, as they're converted to use $inferior_spawn_id. Maybe that's the cleanest. We can e.g., add: #include "lib/set_unbuffered_mode.c" at the top of such files, which avoids an explicit call in "main". That relies on __attribute__ ((constructor)), but we could also call an helper shared function that does the setvbuf from the tests' "main" if we don't want to rely on that attribute. Options, options... > > We need to override ${board}_spawn and pass "-t" to ssh. After this change, > all interrupt.exp tests pass. Since the test harness assumes GDBserver > has tty, probably we should document such requirement somewhere. That's an option too, but it makes me a bit nervous. I'm not sure if we can assume that. > > However, I don't run the whole testsuite with the updated board file > (with -t option to ssh). > --------------050800010305030900060905 Content-Type: text/x-patch; name="0001-Add-a-way-for-boards-to-request-usage-of-the-force-u.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-Add-a-way-for-boards-to-request-usage-of-the-force-u.pa"; filename*1="tch" Content-length: 2299 >From c4f1429d5274f9729cd3254813bacfda48f7ef95 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Thu, 26 Feb 2015 23:18:12 +0000 Subject: [PATCH] Add a way for boards to request usage of the force-unbuffered-mode trick --- gdb/testsuite/boards/native-gdbserver.exp | 2 ++ gdb/testsuite/lib/gdb.exp | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/gdb/testsuite/boards/native-gdbserver.exp b/gdb/testsuite/boards/native-gdbserver.exp index f00ef60..b3bc889 100644 --- a/gdb/testsuite/boards/native-gdbserver.exp +++ b/gdb/testsuite/boards/native-gdbserver.exp @@ -26,6 +26,8 @@ load_board_description "gdbserver-base" # This gdbserver can only run a process once per session. set_board_info gdb,do_reload_on_run 1 +set_board_info gdb,force_unbuffered_mode 1 + # There's no support for argument-passing (yet). set_board_info noargs 1 diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index e4722d2..e7d5e48 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -2850,6 +2850,13 @@ proc gdb_wrapper_init { args } { global gdb_saved_set_unbuffered_mode_obj set gdb_saved_set_unbuffered_mode_obj "" +proc force_unbuffered_mode_p {} { + if {[target_info exists gdb,force_unbuffered_mode] && [target_info gdb,force_unbuffered_mode]} { + return 1 + } + return 0 +} + proc gdb_compile {source dest type options} { global GDB_TESTCASE_OPTIONS global gdb_wrapper_file @@ -2947,13 +2954,14 @@ proc gdb_compile {source dest type options} { } if { $type == "executable" } { - if { ([istarget "*-*-mingw*"] - || [istarget "*-*-*djgpp"] - || [istarget "*-*-cygwin*"])} { + if { [force_unbuffered_mode_p] + || [istarget "*-*-mingw*"] + || [istarget "*-*-*djgpp"] + || [istarget "*-*-cygwin*"]} { # Force output to unbuffered mode, by linking in an object file # with a global contructor that calls setvbuf. # - # Compile the special object seperatelly for two reasons: + # Compile the special object seperately for two reasons: # 1) Insulate it from $options. # 2) Avoid compiling it for every gdb_compile invocation, # which is time consuming, especially if we're remote -- 1.9.3 --------------050800010305030900060905--