summaryrefslogtreecommitdiffstats
path: root/useful/ultrastrace.php
blob: eeff80c28da2d828064d84d36a3c5dbcf45c5b26 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/env php
<?php

if ($argc < 2) die("$argv[0] <tracefile>\n");

function parseTime($time)
{
	return $time['h'] * 3600 + $time['m'] * 60 + $time['s'];
}

$failed = array();
$found = array();

array_shift($argv);

foreach ($argv as $fname) {
	$fh = fopen($fname, 'r');
	if ($fh === false) die("File not found: $fname\n");
	echo "Reading $fname...\n";
	$lineNo = 0;
	unset($lastLine);

	while (!feof($fh)) {
		$lineNo++;
		$line = fgets($fh);
		// open("/lib/x86_64-linux-gnu/tls/x86_64/libkdeui.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
		if (preg_match('#^(\d+\s+)?(?<h>\d+):(?<m>\d+):(?<s>\d+(\.\d+)?)\s#', $line, $out) >= 1) {
			$time = parseTime($out);
			if (isset($lastLine)) {
				if ($time < $lastTime) $lastTime -= 86400;
				if ($lastTime + 2 < $time) {
					echo "\n------------- Delay detected in $fname at line $lineNo:\n$lastLine$line";
				}
			}
			$lastLine = $line;
			$lastTime = $time;
		}
		if (preg_match('#^(\d+\s+)?(\d+:\d+:\d+\.?\d*\s+)?(?<action>access|stat|lstat|stat64|lstat64|readlink|open|openat|execve)\("(?<lib>[^"]*[^"]*[^/])".*\)\s+=\s+(?<ret>\S+)(\s+(?<err>\S+)\s+|$)#', $line, $out) < 1) continue;
		//echo "Match: {$out['lib']} -> {$out['ret']} ({$out['err']})\n";
		$file = basename($out['lib']);
		$file = preg_replace('/\.so(\.\d+)*$/', '', $file);
		if ($out['ret'] < 0) {
			if (isset($found[$file])) {
				$found[$file][] = ':-(    ' . $out['lib'] . ' *** (' . (isset($out['err']) ? $out['err'] : 'Unknown Error') . ') (' . $out['action'] . ')';
			} else {
				$failed[$file][] = ':-(    ' . $out['lib'] . ' *** (' . (isset($out['err']) ? $out['err'] : 'Unknown Error') . ') (' . $out['action'] . ')';
			}
		} else {
			if (isset($failed[$file])) {
				$found[$file] = $failed[$file];
				unset($failed[$file]);
			}
			$found[$file][] = ':-)     ' . $out['lib'] . ' (' . $out['action'] . ')';
		}
	}
	fclose($fh);
}

echo "│\n\n\n│ ******* Found libraries *******************************************************\n";
foreach ($found as $key => $val) {
	echo "│\n├──┬ $key\n";
	$count = count($val);
	$i = 1;
	foreach ($val as $loc) {
		if ($i == $count)	echo "│  ╰── $loc\n";
		else 			echo "│  ├── $loc\n";
		++$i;
	}
}

echo "│\n\n\n│ ******* Missing libraries *****************************************************\n";
foreach ($failed as $key => $val) {
	echo "│\n├──┬ $key\n";
	$count = count($val);
	$i = 1;
	foreach ($val as $loc) {
		if ($i == $count)	echo "│  ╰── $loc\n";
		else 			echo "│  ├── $loc\n";
		++$i;
	}
}