Blame


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