diff options
-rw-r--r-- | callgrind/callgrind_control.in | 13 | ||||
-rw-r--r-- | callgrind/docs/cl-manual.xml | 9 | ||||
-rw-r--r-- | callgrind/main.c | 22 |
3 files changed, 38 insertions, 6 deletions
diff --git a/callgrind/callgrind_control.in b/callgrind/callgrind_control.in index 6492d7b1..4a526d97 100644 --- a/callgrind/callgrind_control.in +++ b/callgrind/callgrind_control.in @@ -192,6 +192,7 @@ $requestDump = 0; $switchInstr = 0; $headerPrinted = 0; $dumpHint = ""; +$verbose = 0; %spids = (); foreach $arg (@ARGV) { @@ -205,6 +206,10 @@ foreach $arg (@ARGV) { elsif ($arg =~ /^--version$/) { printVersion; } + elsif ($arg =~ /^-v$/) { + $verbose++; + next; + } elsif ($arg =~ /^(-s|--stat)$/) { $printStatus = 1; next; @@ -324,7 +329,7 @@ if ($requestZero) { $vgdbCommand = "zero"; } if ($requestKill) { $vgdbCommand = "v.kill"; } if ($switchInstr) { $vgdbCommand = "instrumentation ".$switchInstrMode; } if ($printStatus || $printBacktrace || $requestEvents) { - $vgdbCommand = "status"; + $vgdbCommand = "status internal"; $waitForAnswer = 1; } @@ -336,7 +341,11 @@ foreach $pid (@pids) { print "\n"; next; } - print " [requesting '$vgdbCommand']\n"; + if ($verbose>0) { + print " [requesting '$vgdbCommand']\n"; + } else { + print "\n"; + } open RESULT, "vgdb --pid=$pid $vgdbCommand|"; @tids = (); diff --git a/callgrind/docs/cl-manual.xml b/callgrind/docs/cl-manual.xml index 0da3589e..994ddcba 100644 --- a/callgrind/docs/cl-manual.xml +++ b/callgrind/docs/cl-manual.xml @@ -1093,11 +1093,16 @@ gdbserver (see <xref linkend="manual-core-adv.gdbserver-commandhandling"/>). </listitem> <listitem> - <para>It would be nice to have some more callgrind monitor - commands such as e.g. toggle collect and start instrumentation. + <para><varname>instrumentation [on|off]</varname> requests to set + (if parameter on/off is given) or get the current instrumentation state. </para> </listitem> + <listitem> + <para><varname>status</varname> requests to print out some status + information.</para> + </listitem> + </itemizedlist> </sect1> diff --git a/callgrind/main.c b/callgrind/main.c index 00c076b7..6f8e07de 100644 --- a/callgrind/main.c +++ b/callgrind/main.c @@ -1450,7 +1450,7 @@ static void print_monitor_help ( void ) VG_(gdb_printf) (" zero\n"); VG_(gdb_printf) (" zero counters\n"); VG_(gdb_printf) (" status\n"); - VG_(gdb_printf) (" print status (statistics and shadow stacks)\n"); + VG_(gdb_printf) (" print status\n"); VG_(gdb_printf) (" instrumentation [on|off]\n"); VG_(gdb_printf) (" get/set (if on/off given) instrumentation state\n"); VG_(gdb_printf) ("\n"); @@ -1483,10 +1483,28 @@ static Bool handle_gdb_monitor_command (ThreadId tid, Char *req) CLG_(zero_all_cost)(False); return True; } + case 3: { /* status */ - dump_state_togdb(); + Char* arg = VG_(strtok_r) (0, " ", &ssaveptr); + if (arg && (VG_(strcmp)(arg, "internal") == 0)) { + /* internal interface to callgrind_control */ + dump_state_togdb(); + return True; + } + + if (!CLG_(instrument_state)) { + VG_(gdb_printf)("No status available as instrumentation is switched off\n"); + } else { + // Status information to be improved ... + thread_info** th = CLG_(get_threads)(); + Int t, tcount = 0; + for(t=1;t<VG_N_THREADS;t++) + if (th[t]) tcount++; + VG_(gdb_printf)("%d thread(s) running.\n", tcount); + } return True; } + case 4: { /* instrumentation */ Char* arg = VG_(strtok_r) (0, " ", &ssaveptr); if (!arg) { |