blob: 3651b06faa86233c8621848fc609e6da00e9bca6 [file] [log] [blame]
#!/usr/bin/perl -w
use strict;
use vars qw ($CDBPATH $OUTPUT_DIR $THREAD_UNDERSCORE $THREAD_DEMARCATOR $PID $CDB @ARGV %ENV);
use POSIX;
$PID = $ARGV[0];
if ( ! defined $PID ) {
print "Invalid argument: The script takes pid as argument\n";
exit 1;
}
chomp $PID;
if ($PID !~ /^\d+$/) {
print "Invalid argument: The script takes pid as argument\n";
exit 1;
}
$OUTPUT_DIR = ".";
$THREAD_UNDERSCORE = "\\n**************\\n";
$THREAD_DEMARCATOR = "\\n\\n=======================================================================\\n\\n";
my ($sysname, $nodename, $release, $version, $machine) = POSIX::uname();
if (exists $ENV{CDB}) {
if ($sysname =~ /^CYGWIN.*$/) {
$CDBPATH = `cygpath "$ENV{CDB}"`;
chomp $CDBPATH;
} else {
$CDBPATH = $ENV{CDB};
}
} else {
$CDBPATH = `cygpath "$ENV{GFCPP}/../framework/bin"`;
chomp $CDBPATH;
}
$ENV{PATH} .= ':' . $CDBPATH;
$CDB = "cdb.exe";
my $COMMAND_FILE = $OUTPUT_DIR . "/" . "cdbcomm." . $PID;
open(COMM, ">$COMMAND_FILE") || do {
print "could not open the command file $COMMAND_FILE";
exit 1;
};
print COMM "~\n";
print COMM "q\n";
close COMM;
my $CDBCOMMAND = "$CDB -p $PID -pd -cf $COMMAND_FILE";
my @thread_info = `$CDBCOMMAND`;
open(COMM, ">$COMMAND_FILE") || do {
print "could not open the command file $COMMAND_FILE";
exit 1;
};
foreach my $thr_line(@thread_info) {
if ($thr_line =~ /\s+(\d+)\s+Id:\s*([^\s]+).+/i) {
my $thrd = $1;
my $thrd_id = $2;
my @id_split = split('\.', $thrd_id);
my $pid = hex($id_split[0]);
$thrd_id = hex($id_split[1]);
print COMM ".printf \"$THREAD_UNDERSCORE\\n\"\n";
print COMM ".printf \"THREAD $thrd [PID $pid, ID $thrd_id]\\n\"\n";
print COMM ".printf \"$THREAD_UNDERSCORE\\n\"\n";
print COMM "~${thrd}e kp\n";
print COMM ".printf \"$THREAD_DEMARCATOR\\n\"\n";
}
}
print COMM "q\n";
close COMM;
my @output = `$CDBCOMMAND`;
my $start = 0;
foreach my $out_line(@output) {
if ($out_line =~ /^[0-9]+:[0-9]+\>/) {
$start = 1;
}
elsif ($start == 1 && $out_line !~ /^quit:/) {
chomp $out_line;
print $out_line . "\r\n";
}
}
unlink $COMMAND_FILE;