From patchwork Wed Jul 9 21:10:56 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Evans X-Patchwork-Id: 1987 Received: (qmail 3534 invoked by alias); 9 Jul 2014 21:11:07 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 3364 invoked by uid 89); 9 Jul 2014 21:11:05 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.2 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-qc0-f202.google.com Received: from mail-qc0-f202.google.com (HELO mail-qc0-f202.google.com) (209.85.216.202) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Wed, 09 Jul 2014 21:11:00 +0000 Received: by mail-qc0-f202.google.com with SMTP id x13so1167456qcv.3 for ; Wed, 09 Jul 2014 14:10:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:mime-version:content-type :content-transfer-encoding:message-id:date:to:cc:subject:in-reply-to :references; bh=CsLUdaDZ3rlhEJ+oPCoKy9kqsNtZI3nTQpyajSxmUqs=; b=aycoRdVd+sEep8g5HSU5c1hhHv/5P32A+YqyGiLuevMmrX9BT/lXl5NFvyy9inPCCj /STKBvG30x0CjWDM9r9nxbF3elsX4jasa/fb1D+Z3PhD7nAYi7CKwcLCh1ymzcYiFW20 BvKotqh073JzZQcvSCfjAbt0A41+hOHZKDKLxjK2nbXY/7/33BLZMqnY7q1NItNN7VOm 5j41l+L1NgOtDQ/HEdHQy6UNJzflhq2XOfVo5mGoEwzh+LTC1hBcxd17pJ6WBX/dpOvk zukNOqtkQ9EJ4HJM2wkujS13e8ahffyOCn5txV2zbuMzAosEQFLh5803nR2FtEzMaI6D d23g== X-Gm-Message-State: ALoCoQkkhZSLOcFWWQ8af3loSO25wO5jCZ8Fc/LaB2W8D9G+0rKSyETKLmwXXPKokxbOFZuEPCrx X-Received: by 10.236.31.40 with SMTP id l28mr18249455yha.34.1404940258277; Wed, 09 Jul 2014 14:10:58 -0700 (PDT) Received: from corp2gmr1-1.hot.corp.google.com (corp2gmr1-1.hot.corp.google.com [172.24.189.92]) by gmr-mx.google.com with ESMTPS id j43si2876651yhh.5.2014.07.09.14.10.58 for (version=TLSv1.1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 09 Jul 2014 14:10:58 -0700 (PDT) Received: from ruffy.mtv.corp.google.com (ruffy.mtv.corp.google.com [172.17.128.44]) by corp2gmr1-1.hot.corp.google.com (Postfix) with ESMTP id 91B6D31C1D8; Wed, 9 Jul 2014 14:10:57 -0700 (PDT) From: Doug Evans MIME-Version: 1.0 Message-ID: <21437.45024.997531.453750@ruffy.mtv.corp.google.com> Date: Wed, 9 Jul 2014 14:10:56 -0700 To: Jan Kratochvil Cc: eliz@gnu.org, gdb-patches@sourceware.org Subject: [PATCH] Re: Regression for GDB global --statistics In-Reply-To: <20140630171333.GA2225@host2.jankratochvil.net> References: <20140630171333.GA2225@host2.jankratochvil.net> X-IsSubscribed: yes Jan Kratochvil writes: > On Fri, 15 Mar 2013 23:29:09 +0100, Doug Evans wrote: > > This patch adds a new option to display some simple symtab stats > > akin to how "mt time|space 1" work. For consistency with the > > rest of gdb I named it: > > > > maint set per-command symtab on|off > > maint show per-command symtab > > bd712aed2f88ab824d403c55a212c2be3f41a335 is the first bad commit > commit bd712aed2f88ab824d403c55a212c2be3f41a335 > Author: Doug Evans > Date: Thu Mar 21 17:37:30 2013 +0000 > New commands "mt set per-command {space,time,symtab} {on,off}". > > before (gdb-7.6): > gdb -nx -q -statistics Startup time: 0.031000 (cpu), 0.033828 (wall) > Space used: 4005888 (+4005888 during startup) > (gdb) quit > > after (gdb-7.7+): > gdb -nx -q -statistics (gdb) quit > > Commands stats work now but no longer the global stats. Command stats look > differently ("for this command" vs. "during startup"): > echo echo|gdb -nx -q -statistics > (gdb) Command execution time: 0.000000 (cpu), 0.000008 (wall) > Space used: 4206592 (+0 for this command) > (gdb) quit > > It has been found by Miroslav Franc. Thanks. Here's a patch. 2014-07-09 Doug Evans * maint.c (count_symtabs_and_blocks): Handle NULL current_program_space. (report_command_stats): Check global enabled flag in addition to recorded enabled flag. (make_command_stats_cleanup): Handle msg_type == 0, startup. testsuite/ * gdb.base/maint.exp: Update testing of per-command stats. diff --git a/gdb/maint.c b/gdb/maint.c index 5f34af3..5b11f24 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -830,13 +830,16 @@ count_symtabs_and_blocks (int *nr_symtabs_ptr, int *nr_primary_symtabs_ptr, int nr_primary_symtabs = 0; int nr_blocks = 0; - ALL_SYMTABS (o, s) + if (current_program_space != NULL) { - ++nr_symtabs; - if (s->primary) + ALL_SYMTABS (o, s) { - ++nr_primary_symtabs; - nr_blocks += BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s)); + ++nr_symtabs; + if (s->primary) + { + ++nr_primary_symtabs; + nr_blocks += BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s)); + } } } @@ -856,7 +859,7 @@ report_command_stats (void *arg) struct cmd_stats *start_stats = (struct cmd_stats *) arg; int msg_type = start_stats->msg_type; - if (start_stats->time_enabled) + if (start_stats->time_enabled && per_command_time) { long cmd_time = get_run_time () - start_stats->start_cpu_time; struct timeval now_wall_time, delta_wall_time, wait_time; @@ -877,7 +880,7 @@ report_command_stats (void *arg) (long) delta_wall_time.tv_usec); } - if (start_stats->space_enabled) + if (start_stats->space_enabled && per_command_space) { #ifdef HAVE_SBRK char *lim = (char *) sbrk (0); @@ -894,7 +897,7 @@ report_command_stats (void *arg) #endif } - if (start_stats->symtab_enabled) + if (start_stats->symtab_enabled && per_command_symtab) { int nr_symtabs, nr_primary_symtabs, nr_blocks; @@ -920,8 +923,14 @@ make_command_stats_cleanup (int msg_type) { struct cmd_stats *new_stat; - /* Early exit if we're not reporting any stats. */ - if (!per_command_time + /* Early exit if we're not reporting any stats. It can be expensive to + compute the pre-command values so don't collect them at all if we're + not reporting stats. Alas this doesn't work in the startup case because + we don't know yet whether we will be reporting the stats. For the + startup case collect the data anyway (it should be cheap at this point), + and leave it to the reporter to decide whether to print them. */ + if (msg_type != 0 + && !per_command_time && !per_command_space && !per_command_symtab) return make_cleanup (null_cleanup, 0); @@ -930,7 +939,7 @@ make_command_stats_cleanup (int msg_type) new_stat->msg_type = msg_type; - if (per_command_space) + if (msg_type == 0 || per_command_space) { #ifdef HAVE_SBRK char *lim = (char *) sbrk (0); @@ -939,14 +948,14 @@ make_command_stats_cleanup (int msg_type) #endif } - if (per_command_time) + if (msg_type == 0 || per_command_time) { new_stat->start_cpu_time = get_run_time (); gettimeofday (&new_stat->start_wall_time, NULL); new_stat->time_enabled = 1; } - if (per_command_symtab) + if (msg_type == 0 || per_command_symtab) { int nr_symtabs, nr_primary_symtabs, nr_blocks; diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp index 64753b7..21d0a31 100644 --- a/gdb/testsuite/gdb.base/maint.exp +++ b/gdb/testsuite/gdb.base/maint.exp @@ -130,10 +130,11 @@ gdb_expect { # tests here!! gdb_test_no_output "maint check-symtabs" +# Test per-command stats. gdb_test_no_output "maint set per-command on" - -gdb_test "maint set per-command off" \ +gdb_test "pwd" \ "Command execution time: \[0-9.\]+ \\(cpu\\), \[0-9.\]+ \\(wall\\)\[\r\n\]+Space used: $decimal \\(\\+$decimal for this command\\)\[\r\n\]+#symtabs: $decimal \\(\\+$decimal\\), #primary symtabs: $decimal \\(\\+$decimal\\), #blocks: $decimal \\(\\+$decimal\\)" +gdb_test_no_output "maint set per-command off" gdb_test "maint demangle" \ "\"maintenance demangle\" takes an argument to demangle\\."