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 <sys/time.h>, <time.h>, 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.
This commit is contained in:
Doug Evans 2013-03-21 17:37:30 +00:00
parent d76488d84e
commit bd712aed2f
15 changed files with 464 additions and 166 deletions

View File

@ -1,3 +1,41 @@
2013-03-21 Doug Evans <dje@google.com>
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 <sys/time.h>, <time.h>, 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 <tromey@redhat.com>
* symfile.c (alloc_section_addr_info): Update header. Don't set

View File

@ -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.

View File

@ -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;

View File

@ -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);

View File

@ -1,3 +1,8 @@
2013-03-21 Doug Evans <dje@google.com>
* gdb.texinfo (Maintenance Commands): Add docs for
"mt set per-command {space,time,symtab} {on,off}".
2013-03-14 Hui Zhu <hui@codesourcery.com>
Yao Qi <yao@codesourcery.com>

View File

@ -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

View File

@ -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"

View File

@ -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. */

View File

@ -24,9 +24,12 @@
#include "arch-utils.h"
#include <ctype.h>
#include <signal.h>
#include <sys/time.h>
#include <time.h>
#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\

31
gdb/maint.h Normal file
View File

@ -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 <http://www.gnu.org/licenses/>. */
#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 */

View File

@ -1,3 +1,7 @@
2013-03-21 Doug Evans <dje@google.com>
* gdb.base/maint.exp: Update tests for per-command stats.
2013-03-21 Tom Tromey <tromey@redhat.com>
* gdb.cp/cpexprs.exp: Add test for FILENAME:: case.

View File

@ -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\\."

View File

@ -47,6 +47,7 @@
#include "python/python.h"
#include "interps.h"
#include "observer.h"
#include "maint.h"
/* readline include files. */
#include "readline/readline.h"

View File

@ -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

View File

@ -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);