Blame


1 0a61c07d 2004-04-19 devnull // trace user malloc pool - trace malloc, realloc, and free calls
2 0a61c07d 2004-04-19 devnull // if trumpsbrk is set, we trace sbrkalloc and sbrkmerge too.
3 0a61c07d 2004-04-19 devnull
4 0a61c07d 2004-04-19 devnull _stoprunning = 0;
5 0a61c07d 2004-04-19 devnull trumphexaddrs = 0;
6 0a61c07d 2004-04-19 devnull trumpsbrk = 0;
7 0a61c07d 2004-04-19 devnull
8 0a61c07d 2004-04-19 devnull defn stopped(pid) {
9 0a61c07d 2004-04-19 devnull local l;
10 0a61c07d 2004-04-19 devnull local pc;
11 0a61c07d 2004-04-19 devnull pc = *PC;
12 0a61c07d 2004-04-19 devnull if notes then {
13 0a61c07d 2004-04-19 devnull if (notes[0]!="sys: breakpoint") then
14 0a61c07d 2004-04-19 devnull {
15 0a61c07d 2004-04-19 devnull print(pid,": ",reason(*TRAP),"\t");
16 0a61c07d 2004-04-19 devnull print(fmt(pc,97),"\t",fmt(pc,105),"\n");
17 0a61c07d 2004-04-19 devnull print("Notes pending:\n");
18 0a61c07d 2004-04-19 devnull l = notes;
19 0a61c07d 2004-04-19 devnull while l do
20 0a61c07d 2004-04-19 devnull {
21 0a61c07d 2004-04-19 devnull print("\t",head l,"\n");
22 0a61c07d 2004-04-19 devnull l = tail l;
23 0a61c07d 2004-04-19 devnull }
24 0a61c07d 2004-04-19 devnull _stoprunning = 1;
25 0a61c07d 2004-04-19 devnull }
26 0a61c07d 2004-04-19 devnull }
27 0a61c07d 2004-04-19 devnull }
28 0a61c07d 2004-04-19 devnull
29 0a61c07d 2004-04-19 devnull defn printstack() {
30 0a61c07d 2004-04-19 devnull local frame, stk, pcs, lst, x;
31 0a61c07d 2004-04-19 devnull
32 0a61c07d 2004-04-19 devnull pcs = {*PC};
33 0a61c07d 2004-04-19 devnull stk = strace(*PC,*SP,0);
34 0a61c07d 2004-04-19 devnull while stk do {
35 0a61c07d 2004-04-19 devnull pcs = append pcs, stk[0][1];
36 0a61c07d 2004-04-19 devnull stk = tail stk;
37 0a61c07d 2004-04-19 devnull }
38 0a61c07d 2004-04-19 devnull
39 0a61c07d 2004-04-19 devnull print(" #");
40 0a61c07d 2004-04-19 devnull lst = pcs;
41 0a61c07d 2004-04-19 devnull while lst do {
42 0a61c07d 2004-04-19 devnull if trumphexaddrs != 0 then
43 0a61c07d 2004-04-19 devnull x = lst[0]\X;
44 0a61c07d 2004-04-19 devnull else
45 0a61c07d 2004-04-19 devnull x = lst[0]\a;
46 0a61c07d 2004-04-19 devnull print(" src(", x, ");");
47 0a61c07d 2004-04-19 devnull lst = tail lst;
48 0a61c07d 2004-04-19 devnull }
49 0a61c07d 2004-04-19 devnull print("\n");
50 0a61c07d 2004-04-19 devnull }
51 0a61c07d 2004-04-19 devnull
52 0a61c07d 2004-04-19 devnull defn setuptrump() {
53 0a61c07d 2004-04-19 devnull mallocPC = malloc;
54 0a61c07d 2004-04-19 devnull malloczPC = mallocz;
55 0a61c07d 2004-04-19 devnull freePC = free;
56 0a61c07d 2004-04-19 devnull reallocPC = realloc;
57 0a61c07d 2004-04-19 devnull sbrkallocPC = sbrkalloc;
58 0a61c07d 2004-04-19 devnull sbrkmergePC = sbrkmerge;
59 0a61c07d 2004-04-19 devnull
60 0a61c07d 2004-04-19 devnull // linker might fill delay slot with first instruction
61 0a61c07d 2004-04-19 devnull if objtype == "mips" then {
62 0a61c07d 2004-04-19 devnull mallocPC = mallocPC+4;
63 0a61c07d 2004-04-19 devnull malloczPC = malloczPC+4;
64 0a61c07d 2004-04-19 devnull freePC = freePC+4;
65 0a61c07d 2004-04-19 devnull reallocPC = reallocPC+4;
66 0a61c07d 2004-04-19 devnull sbrkallocPC = sbrkallocPC+4;
67 0a61c07d 2004-04-19 devnull sbrkmergePC = sbrkmergePC+4;
68 0a61c07d 2004-04-19 devnull }
69 0a61c07d 2004-04-19 devnull
70 0a61c07d 2004-04-19 devnull bpset(mallocPC);
71 0a61c07d 2004-04-19 devnull bpset(malloczPC);
72 0a61c07d 2004-04-19 devnull bpset(freePC);
73 0a61c07d 2004-04-19 devnull bpset(reallocPC);
74 0a61c07d 2004-04-19 devnull if trumpsbrk then {
75 0a61c07d 2004-04-19 devnull bpset(sbrkallocPC);
76 0a61c07d 2004-04-19 devnull bpset(sbrkmergePC);
77 0a61c07d 2004-04-19 devnull }
78 0a61c07d 2004-04-19 devnull }
79 0a61c07d 2004-04-19 devnull
80 0a61c07d 2004-04-19 devnull defn cleantrump() {
81 0a61c07d 2004-04-19 devnull stop(pid);
82 0a61c07d 2004-04-19 devnull
83 0a61c07d 2004-04-19 devnull bpdel(mallocPC);
84 0a61c07d 2004-04-19 devnull bpdel(malloczPC);
85 0a61c07d 2004-04-19 devnull bpdel(freePC);
86 0a61c07d 2004-04-19 devnull bpdel(reallocPC);
87 0a61c07d 2004-04-19 devnull bpdel(sbrkallocPC);
88 0a61c07d 2004-04-19 devnull bpdel(sbrkmergePC);
89 0a61c07d 2004-04-19 devnull }
90 0a61c07d 2004-04-19 devnull
91 0a61c07d 2004-04-19 devnull defn trumpflush() {
92 0a61c07d 2004-04-19 devnull stop(pid); // already stopped, but flushes output
93 0a61c07d 2004-04-19 devnull }
94 0a61c07d 2004-04-19 devnull
95 0a61c07d 2004-04-19 devnull defn new() {
96 0a61c07d 2004-04-19 devnull bplist = {};
97 0a61c07d 2004-04-19 devnull newproc(progargs);
98 0a61c07d 2004-04-19 devnull bpset(follow(main)[0]);
99 0a61c07d 2004-04-19 devnull cont();
100 0a61c07d 2004-04-19 devnull bpdel(*PC);
101 0a61c07d 2004-04-19 devnull // clear the hang bit, which is left set by newproc, so programs we fork/exec don't hang
102 0a61c07d 2004-04-19 devnull printto("/proc/"+itoa(pid)+"/ctl", "nohang");
103 0a61c07d 2004-04-19 devnull }
104 0a61c07d 2004-04-19 devnull
105 0a61c07d 2004-04-19 devnull defn trumpfninfo() {
106 0a61c07d 2004-04-19 devnull local arg0, arg1, stk, retpc, params;
107 0a61c07d 2004-04-19 devnull
108 0a61c07d 2004-04-19 devnull stk = strace(*PC, *SP, 0);
109 0a61c07d 2004-04-19 devnull retpc = stk[0][1];
110 0a61c07d 2004-04-19 devnull params = stk[0][2];
111 0a61c07d 2004-04-19 devnull arg0 = params[0][1];
112 0a61c07d 2004-04-19 devnull arg1 = 0;
113 0a61c07d 2004-04-19 devnull if tail params != {} then
114 0a61c07d 2004-04-19 devnull arg1 = params[1][1];
115 0a61c07d 2004-04-19 devnull return {arg0, arg1, retpc};
116 0a61c07d 2004-04-19 devnull }
117 0a61c07d 2004-04-19 devnull
118 0a61c07d 2004-04-19 devnull defn trumpretval() {
119 0a61c07d 2004-04-19 devnull if objtype=="386" then
120 0a61c07d 2004-04-19 devnull return *AX;
121 0a61c07d 2004-04-19 devnull if objtype=="mips" then
122 0a61c07d 2004-04-19 devnull return *R1;
123 0a61c07d 2004-04-19 devnull if objtype=="power" || objtype=="alpha" then
124 0a61c07d 2004-04-19 devnull return *R0;
125 0a61c07d 2004-04-19 devnull }
126 0a61c07d 2004-04-19 devnull
127 0a61c07d 2004-04-19 devnull defn trump() {
128 0a61c07d 2004-04-19 devnull local arg0, arg1, pc, ret, x;
129 0a61c07d 2004-04-19 devnull
130 0a61c07d 2004-04-19 devnull stop(pid);
131 0a61c07d 2004-04-19 devnull _stoprunning = 0;
132 0a61c07d 2004-04-19 devnull setuptrump();
133 0a61c07d 2004-04-19 devnull while !_stoprunning do {
134 0a61c07d 2004-04-19 devnull cont();
135 0a61c07d 2004-04-19 devnull if notes[0]!="sys: breakpoint" then {
136 0a61c07d 2004-04-19 devnull cleantrump();
137 0a61c07d 2004-04-19 devnull return {};
138 0a61c07d 2004-04-19 devnull }
139 0a61c07d 2004-04-19 devnull
140 0a61c07d 2004-04-19 devnull pc = *PC;
141 0a61c07d 2004-04-19 devnull x = trumpfninfo();
142 0a61c07d 2004-04-19 devnull arg0 = x[0];
143 0a61c07d 2004-04-19 devnull if pc == reallocPC || pc == sbrkmergePC then
144 0a61c07d 2004-04-19 devnull arg1 = x[1];
145 0a61c07d 2004-04-19 devnull bpset(x[2]);
146 0a61c07d 2004-04-19 devnull cont();
147 0a61c07d 2004-04-19 devnull bpdel(x[2]);
148 0a61c07d 2004-04-19 devnull ret = trumpretval();
149 0a61c07d 2004-04-19 devnull if pc == mallocPC then
150 0a61c07d 2004-04-19 devnull print(ret\X, " malloc ", arg0\D);
151 0a61c07d 2004-04-19 devnull if pc == malloczPC then
152 0a61c07d 2004-04-19 devnull print(ret\X, " mallocz ", arg0\D);
153 0a61c07d 2004-04-19 devnull if pc == freePC then
154 0a61c07d 2004-04-19 devnull print(arg0\X, " free");
155 0a61c07d 2004-04-19 devnull if pc == reallocPC then
156 0a61c07d 2004-04-19 devnull print(ret\X, " realloc ", arg0\X, " ", arg1\D);
157 0a61c07d 2004-04-19 devnull if pc == sbrkallocPC then
158 0a61c07d 2004-04-19 devnull print(ret\X, " sbrkalloc ", arg0\D);
159 0a61c07d 2004-04-19 devnull if pc == sbrkmergePC then
160 0a61c07d 2004-04-19 devnull print("sbrkmerge ", arg0\X, " ", arg1\X, " = ", ret\D);
161 0a61c07d 2004-04-19 devnull printstack();
162 0a61c07d 2004-04-19 devnull trumpflush();
163 0a61c07d 2004-04-19 devnull }
164 0a61c07d 2004-04-19 devnull }
165 0a61c07d 2004-04-19 devnull
166 0a61c07d 2004-04-19 devnull defn untrump() {
167 0a61c07d 2004-04-19 devnull cleantrump();
168 0a61c07d 2004-04-19 devnull start(pid);
169 0a61c07d 2004-04-19 devnull }
170 0a61c07d 2004-04-19 devnull
171 0a61c07d 2004-04-19 devnull print(acidfile);