Blob


1 //
2 // usage: acid -l pool -l leak
3 //
4 include("/sys/src/libc/port/pool.acid");
6 defn
7 dumppool(p)
8 {
9 complex Pool p;
10 a = p.arenalist;
12 while a != 0 && a < 0x60000000 do {
13 complex Arena a;
14 dumparena(a);
15 a = a.down;
16 }
17 }
19 defn
20 dumparena(arena)
21 {
22 local atail, b, nb;
24 atail = A2TB(arena);
25 complex Bhdr arena;
26 b = a;
27 while b < atail && b.magic != ARENATAIL_MAGIC do {
28 dumpblock(b);
29 nb = B2NB(b);
30 if nb == b then {
31 print("B2NB(", b\X, ") = b\n");
32 b = atail; // end loop
33 }
34 if nb > atail then {
35 b = (Bhdr)(b+4);
36 print("lost at block ", (b-4)\X, ", scanning forward\n");
37 while b < atail && b.magic != KEMPT_MAGIC && b.magic != FREE_MAGIC do
38 b = (Bhdr)(b+4);
39 print("stopped at ", b\X, " ", *b\X, "\n");
40 }else
41 b = nb;
42 }
43 if b != atail then
44 print("found wrong tail to arena ", arena\X, " wanted ", atail\X, "\n");
45 }
47 defn
48 isptr(a)
49 {
50 if end <= a && a < xbloc then
51 return 1;
52 if 0x7efff000 <= a && a < 0x7ffff000 then
53 return 1;
54 return 0;
55 }
57 defn
58 dumpblock(addr)
59 {
60 complex Bhdr addr;
62 if addr.magic == KEMPT_MAGIC || addr.magic == FREE_MAGIC then {
63 local a, x, s;
65 a = addr;
66 complex Alloc a;
68 x = addr+8;
69 if addr.magic == KEMPT_MAGIC then
70 s = "block";
71 else
72 s = "free";
73 print(s, " ", addr\X, " ", a.size\X, " ");
74 print(*(addr+8)\X, " ", *(addr+12)\X, "\n");
75 }
76 }
78 defn
79 dumprange(s, e, type)
80 {
81 local x, y;
83 print("range ", type, " ", s\X, " ", e\X, "\n");
84 x = s;
85 while x < e do {
86 y = *x;
87 if isptr(y) then print("data ", x\X, " ", y\X, " ", type, "\n");
88 x = x + 4;
89 }
90 }
92 defn
93 dumpmem()
94 {
95 local s;
97 xbloc = *bloc;
98 // assume map()[1] is "data"
99 dumprange(map()[1][1], end, "bss"); // bss
100 dumprange(end, xbloc, "alloc"); // allocated
102 if 0x7efff000 < *SP && *SP < 0x7ffff000 then
103 s = *SP;
104 else
105 s = 0x7fff7000; // 32 k
107 dumprange(s, 0x7ffff000, "stack");
110 defn
111 dumpregs()
113 dumprange(0, sizeofUreg, "reg");
117 defn
118 leakdump(l)
120 print("==LEAK BEGIN==\n");
121 dumppool(sbrkmem);
122 dumpmem();
123 dumpregs();
124 while l != {} do {
125 setproc(head l);
126 dumpregs();
127 l = tail l;
129 print("==LEAK END==\n");
132 defn
133 blockdump()
135 print("==BLOCK BEGIN==\n");
136 dumppool(sbrkmem);
137 print("==BLOCK END==\n");