From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id wMRoEj8ouWBoIwAAWB0awg (envelope-from ) for ; Thu, 03 Jun 2021 15:06:39 -0400 Received: by simark.ca (Postfix, from userid 112) id 49B991F163; Thu, 3 Jun 2021 15:06:39 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-0.6 required=5.0 tests=MAILING_LIST_MULTI, RDNS_DYNAMIC,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 1D4531E01F for ; Thu, 3 Jun 2021 15:06:38 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id DA8E9383D02B for ; Thu, 3 Jun 2021 19:06:37 +0000 (GMT) Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) by sourceware.org (Postfix) with ESMTPS id 7C394398FC07 for ; Thu, 3 Jun 2021 19:03:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7C394398FC07 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=palves.net Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-wm1-f50.google.com with SMTP id t16-20020a05600c1990b02901a0d45ff03aso2966691wmq.2 for ; Thu, 03 Jun 2021 12:03:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=H/lrZj+Myj9kvXddfR7VpyQj7DtwR57VG4YjbgZSg9I=; b=T6JODt+XBapvGZdf6ys0Qz2Jrox2gp8mqi5zwBah8wLM3wkDOllgH/uGR4SP/15bOS t6e3IXtORFcSVulLW+Vi2cTS4PYNKruYrzGMfutFKFU5GPWGKN2Ib6FF33+NRSkcXsew ezvsjUtFlauhwRpdTfOKJ+KoXFWz0btWTvYWrxvWAdzjQgqmUNW0vU2ZxReh4LXe0D8A dDzhPmLVQS/Zl1E+Va9VFUsN9PJ9ColXKo6Jx3fPJFWW6TgnTpv8OtMJ8Uq9lB93QZlT bYV40m/enmomnwtIIrzHBoX0UQo8aaghTQkucQQ66yZ6STeOJHxAMr+QtALbtHzLmh16 p1eA== X-Gm-Message-State: AOAM533dp3FX7CH9/osvJ5zV4T0mljpQBTyZI4XDAHsfyvJy06mTms74 wxCTGBBP4yRdio4JivF51WKQCxB20GX4rg== X-Google-Smtp-Source: ABdhPJwRoJ0/b4GCu5AN/gJ92Y501AcSO4hDRBeL6CEHhjvJ9WJkx7eA8TR9bXcDEcudcuQ7zpHeHQ== X-Received: by 2002:a7b:c94a:: with SMTP id i10mr498687wml.29.1622746987795; Thu, 03 Jun 2021 12:03:07 -0700 (PDT) Received: from localhost ([2001:8a0:f932:6a00:6b6e:c7b6:c5a7:aac3]) by smtp.gmail.com with ESMTPSA id h46sm4945483wrh.44.2021.06.03.12.03.06 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 03 Jun 2021 12:03:07 -0700 (PDT) From: Pedro Alves To: gdb-patches@sourceware.org Subject: [PATCH 10/17] gdb.mi/mi-logging.exp, don't send input to GDB while the inferior is running Date: Thu, 3 Jun 2021 20:02:36 +0100 Message-Id: <20210603190243.2609886-11-pedro@palves.net> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210603190243.2609886-1-pedro@palves.net> References: <20210603190243.2609886-1-pedro@palves.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" The gdb.mi/mi-logging.exp testcase sends a sequence of execution commands to the GDB terminal while the inferior is running, like this: send_gdb "1002-exec-step\n" send_gdb "1003-exec-next\n" expecting that GDB will consume the "1003-exec-next" intput after the inferior stops for the 1002-exec-step. That's a flawed assumption in general, because the inferior itself could consume the "1003-exec-next" input while it is stepping. When GDB puts the inferior in its own terminal, while the inferior is running, GDB marshals input from its terminal to the inferior's terminal. The result is that input typed while the inferior is running never goes to GDB, and so the test fails. The previous patch addressed issues like this by making the inferior and GDB share the same terminal for tests that really wanted to test some aspect of a shared terminal. For gdb.mi/mi-logging.exp though, there's really no reason to send input while the program is running, so the fix here is to stop it from doing so. While debugging the testcase, I ran into the fact that it reuses the same log file for more than one [open] sequence, overwriting previous runs. The testcase also deletes the log files at the very end, which makes it impossible to inspect the logs after a failure run. The patch addresses those issues as well. gdb/testsuite/ChangeLog: yyyy-mm-dd Pedro Alves * gdb.mi/mi-logging.exp: Do not reuse log files for different runs. Delete logs at the start of the testcase, not at the end. (wait_open, gdb_test_file): New procedures. Use them. Change-Id: Ife215a82391a020041fd05478bd8dbee6e04d607 --- gdb/testsuite/gdb.mi/mi-logging.exp | 94 +++++++++++++++++++++++------ 1 file changed, 77 insertions(+), 17 deletions(-) diff --git a/gdb/testsuite/gdb.mi/mi-logging.exp b/gdb/testsuite/gdb.mi/mi-logging.exp index ff47b0849c0..d50eaee22c8 100644 --- a/gdb/testsuite/gdb.mi/mi-logging.exp +++ b/gdb/testsuite/gdb.mi/mi-logging.exp @@ -30,9 +30,13 @@ if {[mi_runto_main] < 0} { return -1 } -set milogfile [standard_output_file "milog.txt"] +set milogfile1 [standard_output_file "milog1.txt"] +set milogfile2 [standard_output_file "milog2.txt"] -mi_gdb_test "-gdb-set logging file $milogfile" ".*" +remote_file host delete $milogfile1 +remote_file host delete $milogfile2 + +mi_gdb_test "-gdb-set logging file $milogfile1" ".*" mi_gdb_test "-gdb-set logging overwrite on" ".*" @@ -44,7 +48,7 @@ mi_next "logged next" mi_gdb_test "-gdb-set logging off" ".*" "logging off" -set chan [open $milogfile] +set chan [open $milogfile1] set logcontent [read $chan] close $chan @@ -58,26 +62,84 @@ if [regexp "\\^done\[\r\n\]+$mi_log_prompt\\^running\[\r\n\]+\\*running,thread-i # Now try the redirect, which writes into the file only. -mi_gdb_test "-gdb-set logging redirect on" ".*" "redirect logging on" +mi_gdb_test "-gdb-set logging file $milogfile2" ".*" -# Since all output will be going into the file, just keep sending commands -# and don't expect anything to appear until logging is turned off. +mi_gdb_test "999-gdb-set logging redirect on" ".*" "redirect logging on" send_gdb "1001-gdb-set logging on\n" + +# We can't open the file right away, because we're not waiting for +# GDB's "^done" -- we could end up opening the file before GDB creates +# it. So spin waiting until the file exists. + +proc wait_open {filename} { + set ticks [expr 10 * $::timeout] + set t 0 + + while {![file exists $filename]} { + after 100 + + incr t + if {$t == $ticks} { + return "" + } + } + return [open $filename] +} + +set chan [wait_open $milogfile2] + +# Read GDB output in channel/file CHAN, expect the result. PATTERN is +# the pattern to match for a PASS. + +proc gdb_test_file {chan pattern test} { + global timeout + + verbose -log "gdb_test_file: begin" + + set ticks [expr 10 * $timeout] + set t 0 + set logcontent "" + + while {1} { + set r [read $chan] + append logcontent $r + + send_log -- "$r" + + if [regexp "$pattern" $logcontent] { + pass "$test" + break + } else { + incr t + if {$t == $ticks} { + fail "$test (timeout)" + break + } + after 100 + } + } + + verbose -log "gdb_test_file: end" +} + +gdb_test_file $chan \ + "1001\\^done\[\r\n\]+$mi_log_prompt" \ + "redirect log file contents, set logging on" + send_gdb "1002-exec-step\n" -send_gdb "1003-exec-next\n" +gdb_test_file $chan \ + "1002\\^running\[\r\n\]+\\*running,thread-id=\"all\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt" \ + "redirect log file contents, exec-step" -mi_gdb_test "1004-gdb-set logging off" ".*" "redirect logging off" +send_gdb "1003-exec-next\n" +gdb_test_file $chan \ + "1003\\^running\[\r\n\]+\\*running,thread-id=\"all\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt" \ + "redirect log file contents, exec-next" -set chan [open $milogfile] -set logcontent [read $chan] close $chan -if [regexp "1001\\^done\[\r\n\]+$mi_log_prompt.*1002\\^running\[\r\n\]+\\*running,thread-id=\"all\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt.*1003\\^running\[\r\n\]+\\*running,thread-id=\"all\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt" $logcontent] { - pass "redirect log file contents" -} else { - fail "redirect log file contents" -} +mi_gdb_test "1004-gdb-set logging off" ".*" "redirect logging off" # Now try enabling a redirect while GDB is already logging. This used # to crash GDB. @@ -94,5 +156,3 @@ with_test_prefix "redirect while already logging" { } mi_gdb_exit - -remote_file host delete $milogfile -- 2.26.2