Commit e1c04807 authored by Ole Tange's avatar Ole Tange

tracefile fixed: #9

parent 8be6d396
CMD = blink 2grep 2search burncpu drac duplicate-packets em emoticons \
encdir field find-first-fail forever fxkill G gitnext gitundo \
goodpasswd histogram Loffice mtrr mirrorpdf neno not off \
pdfman pidcmd pidtree plotpipe puniq ramusage rand rclean \
rina rn rrm seekmaniac shython sound-reload splitvideo stdout \
swapout T teetime timestamp tracefile transpose upsidedown \
vid w4it-for-port-open whitehash wifi-reload wssh ytv \
yyyymmdd
encdir fanspeed field find-first-fail forever fxkill G \
gitnext gitundo goodpasswd histogram Loffice mtrr mirrorpdf \
neno not off pdfman pidcmd pidtree plotpipe puniq ramusage \
rand rclean rina rn rrm seekmaniac shython sound-reload \
splitvideo stdout swapout T teetime timestamp tracefile \
transpose upsidedown vid w4it-for-port-open whitehash \
wifi-reload wssh ytv yyyymmdd
all: blink/blink.1 2search/2grep.1 2search/2search.1 \
burncpu/burncpu.1 drac/drac.1 encdir/encdir.1 field/field.1 \
burncpu/burncpu.1 drac/drac.1 encdir/encdir.1 \
fanspeed/fanspeed.1 field/field.1 \
find-first-fail/find-first-fail.1 G/G.1 gitnext/gitnext.1 \
gitundo/gitundo.1 goodpasswd/goodpasswd.1 \
histogram/histogram.1 mirrorpdf/mirrorpdf.1 neno/neno.1 \
......
......@@ -4,6 +4,8 @@ Probably not useful for you, but then again you never now.
2search - binary search through sorted text files.
burncpu - use 100% of some CPU threads.
blink - blink disks in a disk enclosure.
decrypt-root-with-usb - patch for cryptroot to decrypt root with key on USB.
......@@ -12,6 +14,10 @@ duplicate-packets - duplicate packets on an interface. Useful if wifi is bad.
em - force emacs to run in terminal. Use xemacs if installed.
encdir - mount encfs dir or create it if missing.
fanspeed - set fanspeed using IPMI on Dell R815.
field - split on whitespace. Give the given field number. Supports syntax 1-3,6-
find-first-fail - find the lowest argument that makes a command fail.
......@@ -64,6 +70,8 @@ swapout - force swapping out.
T - tee stdout to and from temporary files.
teetime - Save stdin including timing.
timestamp - prepend timestamp to output.
tracefile - list files/dirs being accessed by program.
......
......@@ -41,6 +41,9 @@ test_file() {
tmp=`tempfile`
echo Header > $tmp
seq 100 >> $tmp
echo 10 >> $tmp
echo 12 >> $tmp
echo 15 >> $tmp
10_to_15() { grep ^10$ $1 && grep ^15$ $1; }
export -f 10_to_15
echo 10..15
......
......@@ -154,7 +154,7 @@ B<pipeplot> uses B<gnuplot>.
=head1 SEE ALSO
B<gnuplot>
B<perl>, B<gnuplot>
=cut
......@@ -182,12 +182,12 @@ sub version() {
# Returns: N/A
print join
("\n",
"GNU $Global::progname $Global::version",
"$Global::progname $Global::version",
"Copyright (C) 2020 Ole Tange, http://ole.tange.dk and Free Software",
"Foundation, Inc.",
"License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>",
"This is free software: you are free to change and redistribute it.",
"GNU $Global::progname comes with no warranty.",
"$Global::progname comes with no warranty.",
"",
"Web site: https://gitlab.com/ole.tange/tangetools/-/tree/master/${Global::progname}\n",
"",
......
......@@ -22,3 +22,6 @@ parallel -vj1 doit \
# opening file relative to file descriptor of openat
tracefile lscpu | grep /sys/devices/system/cpu/cpu0/cache/index0/level
echo "should be 635 lines"
tracefile -u perl -e 'for(1..4) { `parallel echo ::: 1 2 3` }' |wc
......@@ -245,17 +245,20 @@ B<strace>(1)
=cut
use Getopt::Long;
sub version();
$Global::progname = "tracefile";
$Global::version = 20201211;
Getopt::Long::Configure("bundling","require_order");
get_options_from_array(\@ARGV) || die_usage();
if($opt::version) { version(); exit(0); }
init_functions();
my @cmd = shell_quote(@ARGV);
my $dir = ".";
my $pid = $opt::pid ? "-p $opt::pid" : "";
my %seen;
my $multithreading_printed;
# BUG: If command gives output on stderr that can confuse the strace output
open(IN, "-|", "strace -ff $pid -e trace=file @cmd 2>&1 >/dev/null") || die;
......@@ -265,20 +268,21 @@ while(<IN>) {
}
# [pid 30817] stat("t/tar.gz", {st_mode=S_IFREG|0644, st_size=140853248, ...}) = 0
# openat(AT_FDCWD, "/tmp/a", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
if(/^(\[[^]]+\])? # Match pid
\s*([^\" ]+) # function e.g. openat
[(] # (
([^",]*) # E.g. AT_FDCWD or 4
[^"]* # E.g. ,
" # "
(([^\\"]|\\[\\"nt])*) # content of string with \n \" \t \\
"(.*)/x) # Rest
if(/^(?:[<]*<unfinished ...>)? # , O_RDONLY|O_CLOEXEC <unfinished ...>
(?:\[[^]]+\])? # Match pid: [pid 46932]
\s*([^\" ]+) # function e.g. openat
[(] # (
([^",]*) # E.g. AT_FDCWD or 4
[^"]* # E.g. ,
" # "
((?:[^\\"]|\\[\\"nt])*) # content of string with \n \" \t \\
"(.*)/x) # Rest
{
# Matches the strace structure for a file
my $function = $2;
my $first_arg = $3;
my $file = shell_unquote($4);
my $addinfo = $6;
my $function = $1;
my $first_arg = $2;
my $file = shell_unquote($3);
my $addinfo = $4;
if($function eq "openat"
or
$function eq "faccessat") {
......@@ -287,14 +291,24 @@ while(<IN>) {
# faccessat(4, "cpu0/cache/index4", F_OK) = -1 ENOENT
# openat can open a file descriptor
# openat/faccessat can open relative to a file descriptor
$addinfo =~ /= (-?\d+)(\s[^=]*)?$/ || die $addinfo,$_;
my $fd = $1;
if($first_arg eq "AT_FDCWD") {
if($addinfo =~ /= (-?\d+)(\s[^=]*)?$/) {
my $fd = $1;
if($first_arg eq "AT_FDCWD") {
$fd{$fd} = $file;
} elsif($first_arg =~ /^\d+$/) {
$file = $fd{$first_arg}."/".$file;
} else { die "Bug: ",$first_arg,$_; }
$fd{$fd} = $file;
} elsif($first_arg =~ /^\d+$/) {
$file = $fd{$first_arg}."/".$file;
} else { die $first_arg,$_; }
$fd{$fd} = $file;
} else {
if($addinfo =~ /<unfinished|strace: Process .* attached|= [?]/) {
# openat(AT_FDCWD, "/...", O_RDONLY|O_CLOEXEC <unfinished ...>
if(not $opt::quiet and not $multithreading_printed++) {
warning("Multi-threading not supported. Output may be wrong.");
}
} else {
die("Wrong format:",$addinfo,$_);
}
}
}
# Relative to $dir
$file =~ s:^([^/]):$dir/$1:;
......@@ -323,7 +337,14 @@ while(<IN>) {
$print = 0;
}
$print and print $file,"\n";
}
} else {
$opt::debug || next;
/^strace: Process .* attached/ && next;
/^(?:.pid \d+. )?<... \S+ resumed>/ && next;
/^(?:.pid \d+. )?... exited with / && next;
/^(?:.pid \d+. )?--- SIG/ && next;
warn "W:",$_;
}
}
{
......@@ -392,6 +413,8 @@ sub options_hash {
# Returns a hash of the GetOptions config
return
("debug|D" => \$opt::debug,
"quiet|q" => \$opt::quiet,
"version|V" => \$opt::version,
"dir|d" => \$opt::dir,
"file|f" => \$opt::file,
"uniq|unique|u" => \$opt::unique,
......@@ -487,6 +510,22 @@ sub error {
print $fh $prog, ": Error: ", @w;
}
sub version() {
# Returns: N/A
print join
("\n",
"$Global::progname $Global::version",
"Copyright (C) 2020 Ole Tange, http://ole.tange.dk and Free Software",
"Foundation, Inc.",
"License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>",
"This is free software: you are free to change and redistribute it.",
"$Global::progname comes with no warranty.",
"",
"Web site: https://gitlab.com/ole.tange/tangetools/-/tree/master/${Global::progname}\n",
);
}
sub my_dump(@) {
# Returns:
# ascii expression of object if Data::Dump(er) is installed
......
......@@ -493,7 +493,7 @@ transpose 20201130
Copyright (C) 2020 Ole Tange, http://ole.tange.dk
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
GNU parallel comes with no warranty.
transpose comes with no warranty.
Web site: https://gitlab.com/ole.tange/tangetools/-/tree/master/transpose
EOF
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment