xref: /plan9/sys/lib/acid/leak (revision decede3daff5663ad9461ecbdee99636df315e35)
159cc4ca5SDavid du Colombier//
259cc4ca5SDavid du Colombier// usage: acid -l pool -l leak
359cc4ca5SDavid du Colombier//
459cc4ca5SDavid du Colombierinclude("/sys/src/libc/port/pool.acid");
559cc4ca5SDavid du Colombier
659cc4ca5SDavid du Colombierdefn
7824682f6SDavid du Colombierdumppool(p, sum)
859cc4ca5SDavid du Colombier{
959cc4ca5SDavid du Colombier	complex Pool p;
1059cc4ca5SDavid du Colombier	a = p.arenalist;
1159cc4ca5SDavid du Colombier
12824682f6SDavid du Colombier	print("A: ", p.arenalist\X, "\n");
13824682f6SDavid du Colombier	while a != 0 && a < 0xff000000 do {
1459cc4ca5SDavid du Colombier		complex Arena a;
15824682f6SDavid du Colombier		dumparena(a, sum);
1659cc4ca5SDavid du Colombier		a = a.down;
1759cc4ca5SDavid du Colombier	}
1859cc4ca5SDavid du Colombier}
1959cc4ca5SDavid du Colombier
2059cc4ca5SDavid du Colombierdefn
21824682f6SDavid du Colombierdumparena(arena, sum)
2259cc4ca5SDavid du Colombier{
2380ee5cbfSDavid du Colombier	local atail, b, nb;
2459cc4ca5SDavid du Colombier
2559cc4ca5SDavid du Colombier	atail = A2TB(arena);
2659cc4ca5SDavid du Colombier	complex Bhdr arena;
2759cc4ca5SDavid du Colombier	b = a;
28824682f6SDavid du Colombier	print("B: ", b\X, " ", atail\X, "\n");
29fb7f0c93SDavid du Colombier	while b < atail && b.magic != ARENATAIL_MAGIC do {
30824682f6SDavid du Colombier		dumpblock(b, sum);
3180ee5cbfSDavid du Colombier		nb = B2NB(b);
3280ee5cbfSDavid du Colombier		if nb == b then {
3359cc4ca5SDavid du Colombier			print("B2NB(", b\X, ") = b\n");
3459cc4ca5SDavid du Colombier			b = atail;	// end loop
3559cc4ca5SDavid du Colombier		}
36fb7f0c93SDavid du Colombier		if nb > atail then {
37fb7f0c93SDavid du Colombier			b = (Bhdr)(b+4);
38fb7f0c93SDavid du Colombier			print("lost at block ", (b-4)\X, ", scanning forward\n");
398847fb04SDavid du Colombier			while b < atail && b.magic != ALLOC_MAGIC && b.magic != FREE_MAGIC do
40fb7f0c93SDavid du Colombier				b = (Bhdr)(b+4);
41fb7f0c93SDavid du Colombier			print("stopped at ", b\X, " ", *b\X, "\n");
42fb7f0c93SDavid du Colombier		}else
4380ee5cbfSDavid du Colombier			b = nb;
4459cc4ca5SDavid du Colombier	}
4559cc4ca5SDavid du Colombier	if b != atail then
46fb7f0c93SDavid du Colombier		print("found wrong tail to arena ", arena\X, " wanted ", atail\X, "\n");
4759cc4ca5SDavid du Colombier}
4859cc4ca5SDavid du Colombier
4959cc4ca5SDavid du Colombierdefn
5059cc4ca5SDavid du Colombierisptr(a)
5159cc4ca5SDavid du Colombier{
5280ee5cbfSDavid du Colombier	if end <= a && a < xbloc then
5359cc4ca5SDavid du Colombier		return 1;
54*decede3dSDavid du Colombier	if 0xdefff000 <= a && a < 0xdffff000 then
5559cc4ca5SDavid du Colombier		return 1;
5659cc4ca5SDavid du Colombier	return 0;
5759cc4ca5SDavid du Colombier}
5859cc4ca5SDavid du Colombier
59824682f6SDavid du Colombierlastalloc = 0;
60824682f6SDavid du Colombierlastcount = 0;
61824682f6SDavid du Colombierlastsize = 0;
6259cc4ca5SDavid du Colombierdefn
63824682f6SDavid du Colombieremitsum()
64824682f6SDavid du Colombier{
65824682f6SDavid du Colombier	if lastalloc then
66824682f6SDavid du Colombier		print("summary ", lastalloc\a, " ", lastcount\D, " ", lastsize\D, "\n");
67824682f6SDavid du Colombier	lastalloc = 0;
68824682f6SDavid du Colombier	lastcount = 0;
69824682f6SDavid du Colombier	lastsize = 0;
70824682f6SDavid du Colombier}
71824682f6SDavid du Colombier
72824682f6SDavid du Colombierdefn
73824682f6SDavid du Colombierdumpblock(addr, sum)
7459cc4ca5SDavid du Colombier{
7559cc4ca5SDavid du Colombier	complex Bhdr addr;
7659cc4ca5SDavid du Colombier
77824682f6SDavid du Colombier	if addr.magic == ALLOC_MAGIC || (!sum && addr.magic == FREE_MAGIC) then {
78fb7f0c93SDavid du Colombier		local a, x, s;
7959cc4ca5SDavid du Colombier
8059cc4ca5SDavid du Colombier		a = addr;
8159cc4ca5SDavid du Colombier		complex Alloc a;
8259cc4ca5SDavid du Colombier
8359cc4ca5SDavid du Colombier		x = addr+8;
84824682f6SDavid du Colombier		if sum then {
85824682f6SDavid du Colombier			if *(addr+8) != lastalloc then {
86824682f6SDavid du Colombier				emitsum();
87824682f6SDavid du Colombier				lastalloc = *(addr+8);
88824682f6SDavid du Colombier			}
89824682f6SDavid du Colombier			lastcount = lastcount+1;
90824682f6SDavid du Colombier			lastsize = lastsize+a.size;
91824682f6SDavid du Colombier		}else{
928847fb04SDavid du Colombier			if addr.magic == ALLOC_MAGIC then
93fb7f0c93SDavid du Colombier				s = "block";
94fb7f0c93SDavid du Colombier			else
95fb7f0c93SDavid du Colombier				s = "free";
96fb7f0c93SDavid du Colombier			print(s, " ", addr\X, " ", a.size\X, " ");
97824682f6SDavid du Colombier			print(*(addr+8)\X, " ", *(addr+12)\X, " ",
98824682f6SDavid du Colombier				*(addr+8)\a, " ", *(addr+12)\a, "\n");
99824682f6SDavid du Colombier		}
10059cc4ca5SDavid du Colombier	}
10159cc4ca5SDavid du Colombier}
10259cc4ca5SDavid du Colombier
10359cc4ca5SDavid du Colombierdefn
10459cc4ca5SDavid du Colombierdumprange(s, e, type)
10559cc4ca5SDavid du Colombier{
10680ee5cbfSDavid du Colombier	local x, y;
10759cc4ca5SDavid du Colombier
10880ee5cbfSDavid du Colombier	print("range ", type, " ", s\X, " ", e\X, "\n");
10959cc4ca5SDavid du Colombier	x = s;
11059cc4ca5SDavid du Colombier	while x < e do {
1114de34a7eSDavid du Colombier		y = *(x\X);
11280ee5cbfSDavid du Colombier		if isptr(y) then print("data ", x\X, " ", y\X, " ", type, "\n");
11359cc4ca5SDavid du Colombier		x = x + 4;
11459cc4ca5SDavid du Colombier	}
11559cc4ca5SDavid du Colombier}
11659cc4ca5SDavid du Colombier
11759cc4ca5SDavid du Colombierdefn
1184de34a7eSDavid du Colombierstacktop()
1194de34a7eSDavid du Colombier{
1204de34a7eSDavid du Colombier	local e, m;
1214de34a7eSDavid du Colombier
1224de34a7eSDavid du Colombier	m = map();
1234de34a7eSDavid du Colombier	while m != {} do {
1244de34a7eSDavid du Colombier		e = head m;
1254de34a7eSDavid du Colombier		if e[0] == "*data" then
1264de34a7eSDavid du Colombier			return e[2];
1274de34a7eSDavid du Colombier		m = tail m;
1284de34a7eSDavid du Colombier	}
129*decede3dSDavid du Colombier	return 0xdffff000;
1304de34a7eSDavid du Colombier}
1314de34a7eSDavid du Colombier
1324de34a7eSDavid du Colombierdefn
13359cc4ca5SDavid du Colombierdumpmem()
13459cc4ca5SDavid du Colombier{
1354de34a7eSDavid du Colombier	local s, top;
13659cc4ca5SDavid du Colombier
13780ee5cbfSDavid du Colombier	xbloc = *bloc;
13859cc4ca5SDavid du Colombier	// assume map()[1] is "data"
13959cc4ca5SDavid du Colombier	dumprange(map()[1][1], end, "bss");	// bss
14080ee5cbfSDavid du Colombier	dumprange(end, xbloc, "alloc");	// allocated
14159cc4ca5SDavid du Colombier
1424de34a7eSDavid du Colombier	top = stacktop() - 8;
1434de34a7eSDavid du Colombier	if top-0x01000000 < *SP && *SP < top then
14459cc4ca5SDavid du Colombier		s = *SP;
14559cc4ca5SDavid du Colombier	else
1464de34a7eSDavid du Colombier		s = top-32*1024;
14759cc4ca5SDavid du Colombier
1484de34a7eSDavid du Colombier	dumprange(s, top, "stack");
14959cc4ca5SDavid du Colombier}
15059cc4ca5SDavid du Colombier
15159cc4ca5SDavid du Colombierdefn
15259cc4ca5SDavid du Colombierdumpregs()
15359cc4ca5SDavid du Colombier{
15459cc4ca5SDavid du Colombier	dumprange(0, sizeofUreg, "reg");
15559cc4ca5SDavid du Colombier}
15659cc4ca5SDavid du Colombier
15759cc4ca5SDavid du Colombier
15859cc4ca5SDavid du Colombierdefn
15959cc4ca5SDavid du Colombierleakdump(l)
16059cc4ca5SDavid du Colombier{
16159cc4ca5SDavid du Colombier	print("==LEAK BEGIN==\n");
162824682f6SDavid du Colombier	dumppool(*mainmem, 0);
16359cc4ca5SDavid du Colombier	dumpmem();
16459cc4ca5SDavid du Colombier	dumpregs();
16559cc4ca5SDavid du Colombier	while l != {} do {
16659cc4ca5SDavid du Colombier		setproc(head l);
16759cc4ca5SDavid du Colombier		dumpregs();
16859cc4ca5SDavid du Colombier		l = tail l;
16959cc4ca5SDavid du Colombier	}
17059cc4ca5SDavid du Colombier	print("==LEAK END==\n");
17159cc4ca5SDavid du Colombier}
1729a747e4fSDavid du Colombier
1739a747e4fSDavid du Colombierdefn
1749a747e4fSDavid du Colombierblockdump()
1759a747e4fSDavid du Colombier{
1769a747e4fSDavid du Colombier	print("==BLOCK BEGIN==\n");
177824682f6SDavid du Colombier	dumppool(*mainmem, 0);
178824682f6SDavid du Colombier	print("==BLOCK END==\n");
179824682f6SDavid du Colombier}
180824682f6SDavid du Colombier
181824682f6SDavid du Colombierdefn
182824682f6SDavid du Colombierblocksummary()
183824682f6SDavid du Colombier{
184824682f6SDavid du Colombier	print("==BLOCK BEGIN==\n");
185824682f6SDavid du Colombier	dumppool(*mainmem, 1);
186824682f6SDavid du Colombier	emitsum();
1879a747e4fSDavid du Colombier	print("==BLOCK END==\n");
1889a747e4fSDavid du Colombier}
189