From: Doug Evans Date: Thu, 21 Mar 2013 17:37:30 +0000 (+0000) Subject: New commands "mt set per-command {space,time,symtab} {on,off}". X-Git-Tag: sid-snapshot-20130401~128 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bd712aed2f88ab824d403c55a212c2be3f41a335;p=platform%2Fupstream%2Fbinutils.git New commands "mt set per-command {space,time,symtab} {on,off}". * NEWS: Add entry. * event-top.c: #include "maint.h". * main.c: #include "maint.h". * maint.c: #include , , block.h, top.h, timeval-utils.h, maint.h, cli/cli-setshow.h. (per_command_time, per_command_space): New static globals. (per_command_symtab): New static global. (per_command_setlist, per_command_showlist): New static globals. (struct cmd_stats): Move here from utils.c. (set_per_command_time): Renamed from set_display_time in utils.c and moved here. All callers updated. (set_per_command_space): Renamed from set_display_space in utils.c and moved here. All callers updated. (count_symtabs_and_blocks): New function. (report_command_stats): Moved here from utils.c. Add support for printing symtab stats. Only print data if enabled before command executed. (make_command_stats_cleanup): Ditto. (sert_per_command_cmd, show_per_command_cmd): New functions. (_initialize_maint_cmds): Add new commands mt set per-command {space,time,symtab} {on,off}. * maint.h: New file. * top.c: #include "maint.h". * utils.c (reset_prompt_for_continue_wait_time): New function. (get_prompt_for_continue_wait_time): New function. * utils.h (reset_prompt_for_continue_wait_time): Declare (get_prompt_for_continue_wait_time): Declare. (make_command_stats_cleanup): Moved to maint.h. (set_display_time, set_display_space): Moved to maint.h and renamed to set_per_command_time, set_per_command_space. * cli/cli-setshow.c (parse_cli_boolean_value): Renamed from parse_binary_operation and made non-static. Don't call error, just return an error marker. All callers updated. * cli/cli-setshow.h (parse_cli_boolean_value): Declare. doc/ * gdb.texinfo (Maintenance Commands): Add docs for "mt set per-command {space,time,symtab} {on,off}". testsuite/ * gdb.base/maint.exp: Update tests for per-command stats. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index ee3f8c4..779e306 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,41 @@ +2013-03-21 Doug Evans + + New commands "mt set per-command {space,time,symtab} {on,off}". + * NEWS: Add entry. + * event-top.c: #include "maint.h". + * main.c: #include "maint.h". + * maint.c: #include , , block.h, top.h, + timeval-utils.h, maint.h, cli/cli-setshow.h. + (per_command_time, per_command_space): New static globals. + (per_command_symtab): New static global. + (per_command_setlist, per_command_showlist): New static globals. + (struct cmd_stats): Move here from utils.c. + (set_per_command_time): Renamed from set_display_time in utils.c + and moved here. All callers updated. + (set_per_command_space): Renamed from set_display_space in utils.c + and moved here. All callers updated. + (count_symtabs_and_blocks): New function. + (report_command_stats): Moved here from utils.c. Add support for + printing symtab stats. Only print data if enabled before command + executed. + (make_command_stats_cleanup): Ditto. + (sert_per_command_cmd, show_per_command_cmd): New functions. + (_initialize_maint_cmds): Add new commands + mt set per-command {space,time,symtab} {on,off}. + * maint.h: New file. + * top.c: #include "maint.h". + * utils.c (reset_prompt_for_continue_wait_time): New function. + (get_prompt_for_continue_wait_time): New function. + * utils.h (reset_prompt_for_continue_wait_time): Declare + (get_prompt_for_continue_wait_time): Declare. + (make_command_stats_cleanup): Moved to maint.h. + (set_display_time, set_display_space): Moved to maint.h and renamed + to set_per_command_time, set_per_command_space. + * cli/cli-setshow.c (parse_cli_boolean_value): Renamed from + parse_binary_operation and made non-static. Don't call error, + just return an error marker. All callers updated. + * cli/cli-setshow.h (parse_cli_boolean_value): Declare. + 2013-03-21 Tom Tromey * symfile.c (alloc_section_addr_info): Update header. Don't set diff --git a/gdb/NEWS b/gdb/NEWS index b759adf..77a27f7 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -3,6 +3,13 @@ *** Changes since GDB 7.6 +* New commands: +maint set|show per-command +maint set|show per-command space +maint set|show per-command time +maint set|show per-command symtab + Enable display of per-command gdb resource usage. + * The command 'tsave' can now support new option '-ctf' to save trace buffer in Common Trace Format. diff --git a/gdb/cli/cli-setshow.c b/gdb/cli/cli-setshow.c index 3a0e978..95ebbe7 100644 --- a/gdb/cli/cli-setshow.c +++ b/gdb/cli/cli-setshow.c @@ -29,10 +29,6 @@ #include "cli/cli-cmds.h" #include "cli/cli-setshow.h" -/* Prototypes for local functions. */ - -static int parse_binary_operation (char *); - /* Return true if the change of command parameter should be notified. */ static int @@ -76,8 +72,10 @@ parse_auto_binary_operation (const char *arg) return AUTO_BOOLEAN_AUTO; /* Pacify GCC. */ } -static int -parse_binary_operation (char *arg) +/* See cli-setshow.h. */ + +int +parse_cli_boolean_value (char *arg) { int length; @@ -100,10 +98,7 @@ parse_binary_operation (char *arg) || strncmp (arg, "disable", length) == 0) return 0; else - { - error (_("\"on\" or \"off\" expected.")); - return 0; - } + return -1; } void @@ -248,8 +243,10 @@ do_set_command (char *arg, int from_tty, struct cmd_list_element *c) break; case var_boolean: { - int val = parse_binary_operation (arg); + int val = parse_cli_boolean_value (arg); + if (val < 0) + error (_("\"on\" or \"off\" expected.")); if (val != *(int *) c->var) { *(int *) c->var = val; diff --git a/gdb/cli/cli-setshow.h b/gdb/cli/cli-setshow.h index 079b9da..152080b 100644 --- a/gdb/cli/cli-setshow.h +++ b/gdb/cli/cli-setshow.h @@ -19,15 +19,15 @@ struct cmd_list_element; -/* Exported to cli/cli-cmds.c and gdb/top.c */ +/* Parse ARG, an option to a boolean variable. + Returns 1 for true, 0 for false, and -1 if invalid. */ +extern int parse_cli_boolean_value (char *arg); extern void do_set_command (char *arg, int from_tty, struct cmd_list_element *c); extern void do_show_command (char *arg, int from_tty, struct cmd_list_element *c); -/* Exported to cli/cli-cmds.c and gdb/top.c, language.c and valprint.c */ - extern void cmd_show_list (struct cmd_list_element *list, int from_tty, char *prefix); diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 4830331..ca4b454 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2013-03-21 Doug Evans + + * gdb.texinfo (Maintenance Commands): Add docs for + "mt set per-command {space,time,symtab} {on,off}". + 2013-03-14 Hui Zhu Yao Qi diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 4ac28bb..e5e97a9 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -35721,24 +35721,33 @@ Control whether to show all non zero areas within a 1k block starting at thread local base, when using the @samp{info w32 thread-information-block} command. -@kindex maint space -@cindex memory used by commands -@item maint space -Control whether to display memory usage for each command. If set to a -nonzero value, @value{GDBN} will display how much memory each command -took, following the command's own output. This can also be requested -by invoking @value{GDBN} with the @option{--statistics} command-line -switch (@pxref{Mode Options}). +@kindex maint set per-command +@kindex maint show per-command +@item maint set per-command +@itemx maint show per-command +@cindex resources used by commands -@kindex maint time -@cindex time of command execution -@item maint time -Control whether to display the execution time of @value{GDBN} for each command. -If set to a nonzero value, @value{GDBN} will display how much time it +@value{GDBN} can display the resources used by each command. +This is useful in debugging performance problems. + +@table @code +@item maint set per-command space [on|off] +@itemx maint show per-command space +Enable or disable the printing of the memory used by GDB for each command. +If enabled, @value{GDBN} will display how much memory each command +took, following the command's own output. +This can also be requested by invoking @value{GDBN} with the +@option{--statistics} command-line switch (@pxref{Mode Options}). + +@item maint set per-command time [on|off] +@itemx maint show per-command time +Enable or disable the printing of the execution time of @value{GDBN} +for each command. +If enabled, @value{GDBN} will display how much time it took to execute each command, following the command's own output. Both CPU time and wallclock time are printed. Printing both is useful when trying to determine whether the cost is -CPU or, e.g., disk/network, latency. +CPU or, e.g., disk/network latency. Note that the CPU time printed is for @value{GDBN} only, it does not include the execution time of the inferior because there's no mechanism currently to compute how much time was spent by @value{GDBN} and how much time was @@ -35746,6 +35755,31 @@ spent by the program been debugged. This can also be requested by invoking @value{GDBN} with the @option{--statistics} command-line switch (@pxref{Mode Options}). +@item maint set per-command symtab [on|off] +@itemx maint show per-command symtab +Enable or disable the printing of basic symbol table statistics +for each command. +If enabled, @value{GDBN} will display the following information: + +@table @bullet +@item number of symbol tables +@itemx number of primary symbol tables +@itemx number of blocks in the blockvector +@end table +@end table + +@kindex maint space +@cindex memory used by commands +@item maint space @var{value} +An alias for @code{maint set per-command space}. +A non-zero value enables it, zero disables it. + +@kindex maint time +@cindex time of command execution +@item maint time @var{value} +An alias for @code{maint set per-command time}. +A non-zero value enables it, zero disables it. + @kindex maint translate-address @item maint translate-address @r{[}@var{section}@r{]} @var{addr} Find the symbol stored at the location specified by the address diff --git a/gdb/event-top.c b/gdb/event-top.c index bd92ef1..10f1499 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -36,6 +36,7 @@ #include "continuations.h" #include "gdbcmd.h" /* for dont_repeat() */ #include "annotate.h" +#include "maint.h" /* readline include files. */ #include "readline/readline.h" diff --git a/gdb/main.c b/gdb/main.c index 06f3feb..08a2769 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -42,6 +42,7 @@ #include "python/python.h" #include "objfiles.h" #include "auto-load.h" +#include "maint.h" /* The selected interpreter. This will be used as a set command variable, so it should always be malloc'ed - since @@ -538,8 +539,8 @@ captured_main (void *data) break; case OPT_STATISTICS: /* Enable the display of both time and space usage. */ - set_display_time (1); - set_display_space (1); + set_per_command_time (1); + set_per_command_space (1); break; case OPT_TUI: /* --tui is equivalent to -i=tui. */ diff --git a/gdb/maint.c b/gdb/maint.c index b835db6..db3e63d 100644 --- a/gdb/maint.c +++ b/gdb/maint.c @@ -24,9 +24,12 @@ #include "arch-utils.h" #include #include +#include +#include #include "command.h" #include "gdbcmd.h" #include "symtab.h" +#include "block.h" #include "gdbtypes.h" #include "demangle.h" #include "gdbcore.h" @@ -36,9 +39,13 @@ #include "objfiles.h" #include "value.h" #include "gdb_assert.h" +#include "top.h" +#include "timeval-utils.h" +#include "maint.h" #include "cli/cli-decode.h" #include "cli/cli-utils.h" +#include "cli/cli-setshow.h" extern void _initialize_maint_cmds (void); @@ -164,7 +171,7 @@ maintenance_time_display (char *args, int from_tty) if (args == NULL || *args == '\0') printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n")); else - set_display_time (strtol (args, NULL, 10)); + set_per_command_time (strtol (args, NULL, 10)); } static void @@ -173,7 +180,7 @@ maintenance_space_display (char *args, int from_tty) if (args == NULL || *args == '\0') printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n"); else - set_display_space (strtol (args, NULL, 10)); + set_per_command_space (strtol (args, NULL, 10)); } /* The "maintenance info" command is defined as a prefix, with @@ -725,7 +732,243 @@ maintenance_set_profile_cmd (char *args, int from_tty, error (_("Profiling support is not available on this system.")); } #endif + +/* If nonzero, display time usage both at startup and for each command. */ +static int per_command_time; + +/* If nonzero, display space usage both at startup and for each command. */ + +static int per_command_space; + +/* If nonzero, display basic symtab stats for each command. */ + +static int per_command_symtab; + +/* mt per-command commands. */ + +static struct cmd_list_element *per_command_setlist; +static struct cmd_list_element *per_command_showlist; + +/* Records a run time and space usage to be used as a base for + reporting elapsed time or change in space. */ + +struct cmd_stats +{ + /* Zero if the saved time is from the beginning of GDB execution. + One if from the beginning of an individual command execution. */ + int msg_type; + /* Track whether the stat was enabled at the start of the command + so that we can avoid printing anything if it gets turned on by + the current command. */ + int time_enabled : 1; + int space_enabled : 1; + int symtab_enabled : 1; + long start_cpu_time; + struct timeval start_wall_time; + long start_space; + /* Total number of symtabs (over all objfiles). */ + int start_nr_symtabs; + /* Of those, a count of just the primary ones. */ + int start_nr_primary_symtabs; + /* Total number of blocks. */ + int start_nr_blocks; +}; + +/* Set whether to display time statistics to NEW_VALUE + (non-zero means true). */ + +void +set_per_command_time (int new_value) +{ + per_command_time = new_value; +} + +/* Set whether to display space statistics to NEW_VALUE + (non-zero means true). */ + +void +set_per_command_space (int new_value) +{ + per_command_space = new_value; +} + +/* Count the number of symtabs and blocks. */ + +static void +count_symtabs_and_blocks (int *nr_symtabs_ptr, int *nr_primary_symtabs_ptr, + int *nr_blocks_ptr) +{ + struct objfile *o; + struct symtab *s; + int nr_symtabs = 0; + int nr_primary_symtabs = 0; + int nr_blocks = 0; + + ALL_SYMTABS (o, s) + { + ++nr_symtabs; + if (s->primary) + { + ++nr_primary_symtabs; + nr_blocks += BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s)); + } + } + + *nr_symtabs_ptr = nr_symtabs; + *nr_primary_symtabs_ptr = nr_primary_symtabs; + *nr_blocks_ptr = nr_blocks; +} + +/* As indicated by display_time and display_space, report GDB's elapsed time + and space usage from the base time and space provided in ARG, which + must be a pointer to a struct cmd_stat. This function is intended + to be called as a cleanup. */ + +static void +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) + { + long cmd_time = get_run_time () - start_stats->start_cpu_time; + struct timeval now_wall_time, delta_wall_time, wait_time; + + gettimeofday (&now_wall_time, NULL); + timeval_sub (&delta_wall_time, + &now_wall_time, &start_stats->start_wall_time); + + /* Subtract time spend in prompt_for_continue from walltime. */ + wait_time = get_prompt_for_continue_wait_time (); + timeval_sub (&delta_wall_time, &delta_wall_time, &wait_time); + + printf_unfiltered (msg_type == 0 + ? _("Startup time: %ld.%06ld (cpu), %ld.%06ld (wall)\n") + : _("Command execution time: %ld.%06ld (cpu), %ld.%06ld (wall)\n"), + cmd_time / 1000000, cmd_time % 1000000, + (long) delta_wall_time.tv_sec, + (long) delta_wall_time.tv_usec); + } + + if (start_stats->space_enabled) + { +#ifdef HAVE_SBRK + char *lim = (char *) sbrk (0); + + long space_now = lim - lim_at_start; + long space_diff = space_now - start_stats->start_space; + + printf_unfiltered (msg_type == 0 + ? _("Space used: %ld (%s%ld during startup)\n") + : _("Space used: %ld (%s%ld for this command)\n"), + space_now, + (space_diff >= 0 ? "+" : ""), + space_diff); +#endif + } + + if (start_stats->symtab_enabled) + { + int nr_symtabs, nr_primary_symtabs, nr_blocks; + + count_symtabs_and_blocks (&nr_symtabs, &nr_primary_symtabs, &nr_blocks); + printf_unfiltered (_("#symtabs: %d (+%d)," + " #primary symtabs: %d (+%d)," + " #blocks: %d (+%d)\n"), + nr_symtabs, + nr_symtabs - start_stats->start_nr_symtabs, + nr_primary_symtabs, + nr_primary_symtabs - start_stats->start_nr_primary_symtabs, + nr_blocks, + nr_blocks - start_stats->start_nr_blocks); + } +} + +/* Create a cleanup that reports time and space used since its creation. + MSG_TYPE is zero for gdb startup, otherwise it is one(1) to report + data for individual commands. */ + +struct cleanup * +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 + && !per_command_space + && !per_command_symtab) + return make_cleanup (null_cleanup, 0); + + new_stat = XZALLOC (struct cmd_stats); + + new_stat->msg_type = msg_type; + + if (per_command_space) + { +#ifdef HAVE_SBRK + char *lim = (char *) sbrk (0); + new_stat->start_space = lim - lim_at_start; + new_stat->space_enabled = 1; +#endif + } + + if (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) + { + int nr_symtabs, nr_primary_symtabs, nr_blocks; + + count_symtabs_and_blocks (&nr_symtabs, &nr_primary_symtabs, &nr_blocks); + new_stat->start_nr_symtabs = nr_symtabs; + new_stat->start_nr_primary_symtabs = nr_primary_symtabs; + new_stat->start_nr_blocks = nr_blocks; + new_stat->symtab_enabled = 1; + } + + /* Initalize timer to keep track of how long we waited for the user. */ + reset_prompt_for_continue_wait_time (); + + return make_cleanup_dtor (report_command_stats, new_stat, xfree); +} + +/* Handle unknown "mt set per-command" arguments. + In this case have "mt set per-command on|off" affect every setting. */ + +static void +set_per_command_cmd (char *args, int from_tty) +{ + struct cmd_list_element *list; + size_t length; + int val; + + val = parse_cli_boolean_value (args); + if (val < 0) + error (_("Bad value for 'mt set per-command no'.")); + + for (list = per_command_setlist; list != NULL; list = list->next) + if (list->var_type == var_boolean) + { + gdb_assert (list->type == set_cmd); + do_set_command (args, from_tty, list); + } +} + +/* Command "show per-command" displays summary of all the current + "show per-command " settings. */ + +static void +show_per_command_cmd (char *args, int from_tty) +{ + cmd_show_list (per_command_showlist, from_tty, ""); +} + void _initialize_maint_cmds (void) { @@ -802,12 +1045,56 @@ Call internal GDB demangler routine to demangle a C++ link name\n\ and prints the result."), &maintenancelist); + add_prefix_cmd ("per-command", class_maintenance, set_per_command_cmd, _("\ +Per-command statistics settings."), + &per_command_setlist, "set per-command ", + 1/*allow-unknown*/, &maintenance_set_cmdlist); + + add_prefix_cmd ("per-command", class_maintenance, show_per_command_cmd, _("\ +Show per-command statistics settings."), + &per_command_showlist, "show per-command ", + 0/*allow-unknown*/, &maintenance_show_cmdlist); + + add_setshow_boolean_cmd ("time", class_maintenance, + &per_command_time, _("\ +Set whether to display per-command execution time."), _("\ +Show whether to display per-command execution time."), + _("\ +If enabled, the execution time for each command will be\n\ +displayed following the command's output."), + NULL, NULL, + &per_command_setlist, &per_command_showlist); + + add_setshow_boolean_cmd ("space", class_maintenance, + &per_command_space, _("\ +Set whether to display per-command space usage."), _("\ +Show whether to display per-command space usage."), + _("\ +If enabled, the space usage for each command will be\n\ +displayed following the command's output."), + NULL, NULL, + &per_command_setlist, &per_command_showlist); + + add_setshow_boolean_cmd ("symtab", class_maintenance, + &per_command_symtab, _("\ +Set whether to display per-command symtab statistics."), _("\ +Show whether to display per-command symtab statistics."), + _("\ +If enabled, the basic symtab statistics for each command will be\n\ +displayed following the command's output."), + NULL, NULL, + &per_command_setlist, &per_command_showlist); + + /* This is equivalent to "mt set per-command time on". + Kept because some people are used to typing "mt time 1". */ add_cmd ("time", class_maintenance, maintenance_time_display, _("\ Set the display of time usage.\n\ If nonzero, will cause the execution time for each command to be\n\ displayed, following the command's output."), &maintenancelist); + /* This is equivalent to "mt set per-command space on". + Kept because some people are used to typing "mt space 1". */ add_cmd ("space", class_maintenance, maintenance_space_display, _("\ Set the display of space usage.\n\ If nonzero, will cause the execution space for each command to be\n\ diff --git a/gdb/maint.h b/gdb/maint.h new file mode 100644 index 0000000..51d53b0 --- /dev/null +++ b/gdb/maint.h @@ -0,0 +1,31 @@ +/* Support for GDB maintenance commands. + Copyright (C) 2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +#ifndef MAINT_H +#define MAINT_H + +extern void set_per_command_time (int); + +extern void set_per_command_space (int); + +/* Note: There's no set_per_command_symtab on purpose. + Symtab stats aren't yet as useful for --statistics output. */ + +extern struct cleanup *make_command_stats_cleanup (int); + +#endif /* MAINT_H */ diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index afbb5eb..690126c 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-03-21 Doug Evans + + * gdb.base/maint.exp: Update tests for per-command stats. + 2013-03-21 Tom Tromey * gdb.cp/cpexprs.exp: Add test for FILENAME:: case. diff --git a/gdb/testsuite/gdb.base/maint.exp b/gdb/testsuite/gdb.base/maint.exp index e3b6e3c..a867c50 100644 --- a/gdb/testsuite/gdb.base/maint.exp +++ b/gdb/testsuite/gdb.base/maint.exp @@ -21,10 +21,8 @@ #maintenance check-symtabs -- Check consistency of psymtabs and symtabs -#maintenance space -- Set the display of space usage #maintenance set -- Set GDB internal variables used by the GDB maintainer #maintenance show -- Show GDB internal variables used by the GDB maintainer -#maintenance time -- Set the display of time usage #maintenance demangle -- Demangle a C++ mangled name #maintenance dump-me -- Get fatal error; make debugger dump its core #maintenance print -- Maintenance command for printing GDB internal state @@ -126,22 +124,10 @@ gdb_expect { timeout { fail "(timeout) maint check-symtabs" } } -gdb_test "maint space" \ - "\"maintenance space\" takes a numeric argument\\." +gdb_test_no_output "maint set per-command on" -gdb_test "maint space 1" \ - "Space used: $decimal \\(\\+$decimal for this command\\)" - -gdb_test "maint time" \ - "\"maintenance time\" takes a numeric argument\\..*Space used: $decimal \\(\\+$decimal for this command\\)" - -gdb_test "maint time 1" \ - "Command execution time: $decimal.*Space used: $decimal \\(\\+$decimal for this command\\)" - -gdb_test "maint time 0" \ - "Space used: $decimal \\(\\+$decimal for this command\\)" - -gdb_test_no_output "maint space 0" +gdb_test "maint set per-command off" \ + "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 "maint demangle" \ "\"maintenance demangle\" takes an argument to demangle\\." diff --git a/gdb/top.c b/gdb/top.c index e06c5ee..7905b51 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -47,6 +47,7 @@ #include "python/python.h" #include "interps.h" #include "observer.h" +#include "maint.h" /* readline include files. */ #include "readline/readline.h" diff --git a/gdb/utils.c b/gdb/utils.c index 4c2f08c..a28c782 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -544,117 +544,6 @@ free_current_contents (void *ptr) *location = NULL; } } - -/* If nonzero, display time usage both at startup and for each command. */ - -static int display_time; - -/* If nonzero, display space usage both at startup and for each command. */ - -static int display_space; - -/* Records a run time and space usage to be used as a base for - reporting elapsed time or change in space. In addition, - the msg_type field indicates whether the saved time is from the - beginning of GDB execution (0) or the beginning of an individual - command execution (1). */ -struct cmd_stats -{ - int msg_type; - long start_cpu_time; - struct timeval start_wall_time; - long start_space; -}; - -/* Set whether to display time statistics to NEW_VALUE (non-zero - means true). */ -void -set_display_time (int new_value) -{ - display_time = new_value; -} - -/* Set whether to display space statistics to NEW_VALUE (non-zero - means true). */ -void -set_display_space (int new_value) -{ - display_space = new_value; -} - -/* As indicated by display_time and display_space, report GDB's elapsed time - and space usage from the base time and space provided in ARG, which - must be a pointer to a struct cmd_stat. This function is intended - to be called as a cleanup. */ -static void -report_command_stats (void *arg) -{ - struct cmd_stats *start_stats = (struct cmd_stats *) arg; - int msg_type = start_stats->msg_type; - - if (display_time) - { - long cmd_time = get_run_time () - start_stats->start_cpu_time; - struct timeval now_wall_time, delta_wall_time; - - gettimeofday (&now_wall_time, NULL); - timeval_sub (&delta_wall_time, - &now_wall_time, &start_stats->start_wall_time); - - /* Subtract time spend in prompt_for_continue from walltime. */ - timeval_sub (&delta_wall_time, - &delta_wall_time, &prompt_for_continue_wait_time); - - printf_unfiltered (msg_type == 0 - ? _("Startup time: %ld.%06ld (cpu), %ld.%06ld (wall)\n") - : _("Command execution time: %ld.%06ld (cpu), %ld.%06ld (wall)\n"), - cmd_time / 1000000, cmd_time % 1000000, - (long) delta_wall_time.tv_sec, - (long) delta_wall_time.tv_usec); - } - - if (display_space) - { -#ifdef HAVE_SBRK - char *lim = (char *) sbrk (0); - - long space_now = lim - lim_at_start; - long space_diff = space_now - start_stats->start_space; - - printf_unfiltered (msg_type == 0 - ? _("Space used: %ld (%s%ld during startup)\n") - : _("Space used: %ld (%s%ld for this command)\n"), - space_now, - (space_diff >= 0 ? "+" : ""), - space_diff); -#endif - } -} - -/* Create a cleanup that reports time and space used since its - creation. Precise messages depend on MSG_TYPE: - 0: Initial time/space - 1: Individual command time/space. */ -struct cleanup * -make_command_stats_cleanup (int msg_type) -{ - static const struct timeval zero_timeval = { 0 }; - struct cmd_stats *new_stat = XMALLOC (struct cmd_stats); - -#ifdef HAVE_SBRK - char *lim = (char *) sbrk (0); - new_stat->start_space = lim - lim_at_start; -#endif - - new_stat->msg_type = msg_type; - new_stat->start_cpu_time = get_run_time (); - gettimeofday (&new_stat->start_wall_time, NULL); - - /* Initalize timer to keep track of how long we waited for the user. */ - prompt_for_continue_wait_time = zero_timeval; - - return make_cleanup_dtor (report_command_stats, new_stat, xfree); -} @@ -1924,6 +1813,24 @@ prompt_for_continue (void) dont_repeat (); /* Forget prev cmd -- CR won't repeat it. */ } +/* Initalize timer to keep track of how long we waited for the user. */ + +void +reset_prompt_for_continue_wait_time (void) +{ + static const struct timeval zero_timeval = { 0 }; + + prompt_for_continue_wait_time = zero_timeval; +} + +/* Fetch the cumulative time spent in prompt_for_continue. */ + +struct timeval +get_prompt_for_continue_wait_time (void) +{ + return prompt_for_continue_wait_time; +} + /* Reinitialize filter; ie. tell it to reset to original values. */ void diff --git a/gdb/utils.h b/gdb/utils.h index 52bcaff..9015c86 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -53,6 +53,11 @@ extern char *safe_strerror (int); bfd_check_format_matches, and will be freed. */ extern const char *gdb_bfd_errmsg (bfd_error_type error_tag, char **matching); + +/* Reset the prompt_for_continue clock. */ +void reset_prompt_for_continue_wait_time (void); +/* Return the time spent in prompt_for_continue. */ +struct timeval get_prompt_for_continue_wait_time (void); /* Parsing utilites. */ @@ -110,8 +115,6 @@ extern struct cleanup *make_cleanup_htab_delete (htab_t htab); extern void free_current_contents (void *); -extern struct cleanup *make_command_stats_cleanup (int); - extern void init_page_info (void); extern struct cleanup *make_cleanup_restore_page_info (void); @@ -136,10 +139,6 @@ char *ldirname (const char *filename); struct ui_file; -extern void set_display_time (int); - -extern void set_display_space (int); - extern int query (const char *, ...) ATTRIBUTE_PRINTF (1, 2); extern int nquery (const char *, ...) ATTRIBUTE_PRINTF (1, 2); extern int yquery (const char *, ...) ATTRIBUTE_PRINTF (1, 2);