summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorweidendo <weidendo@a5019735-40e9-0310-863c-91ae7b9d1cf9>2011-09-06 19:08:35 +0000
committerweidendo <weidendo@a5019735-40e9-0310-863c-91ae7b9d1cf9>2011-09-06 19:08:35 +0000
commitce6489fe9295604df9028f114482f9eba2c73a16 (patch)
tree45353624ffba4eed2fa72c5f6bbc4c9dc42897db
parent23642271f41ad858fa0935b8b870290b45bd5eeb (diff)
Make some vgdb interface to callgrind_control internal
The vgdb "status" monitor command is still available, but used for pretty printing of status information now (acutally, just some place holder for real information up to now: just number of running threads). The internal interface used by callgrind_control to provide stack traces and event counts is using "status internal", and is not documented, as the format is not for human consumption. This also adds some documentation. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12014 a5019735-40e9-0310-863c-91ae7b9d1cf9
-rw-r--r--callgrind/callgrind_control.in13
-rw-r--r--callgrind/docs/cl-manual.xml9
-rw-r--r--callgrind/main.c22
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) {