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