#!/usr/bin/perl use Getopt::Long; GetOptions("pid=i" => \$pid, "trace!" => \$trace, "nonet!" => \$nonet); # print "$pid\n"; $subsys->{UNDEFINED} = 0; $subsys->{MDC} = 1; $subsys->{MDS} = 2; $subsys->{OSC} = 3; $subsys->{OST} = 4; $subsys->{CLASS} = 5; $subsys->{OBDFS} = 6; $subsys->{LLITE} = 7; $subsys->{RPC} = 8; $subsys->{EXT2OBD} = 9; $subsys->{PORTALS} = 10; $subsys->{SOCKNAL} = 11; $subsys->{QSWNAL} = 12; $subsys->{PINGER} = 13; $subsys->{FILTER} = 14; $subsys->{TRACE} = 15; # obdtrace, not to be confused with D_TRACE */ $subsys->{ECHO} = 16; $subsys->{LDLM} = 17; $subsys->{LOV} = 18; $subsys->{GMNAL} = 19; $subsys->{PTLROUTER} = 20; $masks->{TRACE} = 1 << 0; # /* ENTRY/EXIT markers */ $masks->{INODE} = 1 << 1; # $masks->{SUPER} = 1 << 2; # $masks->{EXT2} = 1 << 3; # /* anything from ext2_debug */ $masks->{MALLOC} = 1 << 4; # /* print malloc, free information */ $masks->{CACHE} = 1 << 5; # /* cache-related items */ $masks->{INFO} = 1 << 6; # /* general information */ $masks->{IOCTL} = 1 << 7; # /* ioctl related information */ $masks->{BLOCKS} = 1 << 8; # /* ext2 block allocation */ $masks->{NET} = 1 << 9; # /* network communications */ $masks->{WARNING} = 1 << 10; # $masks->{BUFFS} = 1 << 11; # $masks->{OTHER} = 1 << 12; # $masks->{DENTRY} = 1 << 13; # $masks->{PORTALS} = 1 << 14; # /* ENTRY/EXIT markers */ $masks->{PAGE} = 1 << 15; # /* bulk page handling */ $masks->{DLMTRACE} = 1 << 16; # $masks->{ERROR} = 1 << 17; # /* CERROR} = ...) == CDEBUG} = D_ERROR, ...) */ $masks->{EMERG} = 1 << 18; # /* CEMERG} = ...) == CDEBUG} = D_EMERG, ...) */ $masks->{HA} = 1 << 19; # /* recovery and failover */ sub extractpid { $_ = shift; # print "$_\n"; /l. [0-9]* (.*)\):/; return $1; } sub entering { $_ = shift; $entering = /Process entered/; } sub leaving { $_ = shift; $entering = /Process leaving/; } sub getsubsys { my ($subsys, $mask) = split ":"; return $subsys; } sub getmask { my ($subsys, $mask) = split ":"; return $mask; } while () { $linepid = extractpid($_); $linemask = getmask($_); $linesubsys = getsubsys($_); # printf "---> mask %x subsys %x\n", $linemask, $linesubsys; if (leaving($_)) { chop $prefix->{$linepid}; chop $prefix->{$linepid}; } if ( !$pid || $linepid == $pid) { next if ($trace && $linemask != $masks->{TRACE}); next if ($nonet && ( $linesubsys == $subsys->{RPC} || $linesubsys == $subsys->{NET} || $linesubsys == $subsys->{PORTALS} || $linesubsys == $subsys->{SOCKNAL} || $linesubsys == $subsys->{QSWNAL} || $linesubsys == $subsys->{GMNAL})); # printf "sub/mask: %s - %s\n", getsubsys($_), getmask($_); printf "%s%s", $prefix->{$linepid}, $_; last if $count++ > 100; } if (entering($_)) { $prefix->{$linepid} .= ' '; } } # printf "argv %s pid %d\n", $ARGV[0], extractpid($ARGV[0]);