xref: /plan9-contrib/sys/lib/acid/acme (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
1219b2ee8SDavid du Colombier// support for acme; acid must be run with /acme/acid/$cputype/Acid
2219b2ee8SDavid du Colombier
37dd7cddfSDavid du Colombier
4219b2ee8SDavid du Colombierdefn w(*code)
5219b2ee8SDavid du Colombier{
6219b2ee8SDavid du Colombier	local dir;
7219b2ee8SDavid du Colombier
87dd7cddfSDavid du Colombier	printto("/tmp/acme.acid", eval code);
97dd7cddfSDavid du Colombier	rc("cat /tmp/acme.acid | wnew -d "+"Acid/-stk'("+itoa(pid)+")'");
10219b2ee8SDavid du Colombier}
11219b2ee8SDavid du Colombier
12219b2ee8SDavid du Colombierdefn procstk(pid, name)
13219b2ee8SDavid du Colombier{
14219b2ee8SDavid du Colombier	local dir;
15219b2ee8SDavid du Colombier
167dd7cddfSDavid du Colombier	printto("/tmp/acme.acid", stk());
17*59cc4ca5SDavid du Colombier	rc("cat /tmp/acme.acid | wnew -d "+"Acid/-'"+name+"("+itoa(pid)+")'");
18219b2ee8SDavid du Colombier}
19219b2ee8SDavid du Colombier
20219b2ee8SDavid du Colombierdefn taskstk(tid, name)
21219b2ee8SDavid du Colombier{
22219b2ee8SDavid du Colombier	local dir;
23219b2ee8SDavid du Colombier
24*59cc4ca5SDavid du Colombier	printto("/tmp/acme.acid", threadstk(tid));
257dd7cddfSDavid du Colombier	rc("cat /tmp/acme.acid | wnew -d "+"Acid/-"+name+"'("+itoa(pid)+")'");
26219b2ee8SDavid du Colombier}
27219b2ee8SDavid du Colombier
28219b2ee8SDavid du Colombierdefn _stk(pc, sp, link, dolocals)
29219b2ee8SDavid du Colombier{
30219b2ee8SDavid du Colombier	local stk;
31219b2ee8SDavid du Colombier
32219b2ee8SDavid du Colombier	print("At pc:", pc, ":", fmt(pc, 'a'), " ");
33219b2ee8SDavid du Colombier	pfl(pc);
34219b2ee8SDavid du Colombier
35219b2ee8SDavid du Colombier	stk = strace(pc, sp, link);
36219b2ee8SDavid du Colombier
37219b2ee8SDavid du Colombier	while stk do {
38219b2ee8SDavid du Colombier		frame = head stk;
39219b2ee8SDavid du Colombier		print(fmt(frame[0], 'a'), "(");
40219b2ee8SDavid du Colombier		params(frame[2], frame[0]);
41219b2ee8SDavid du Colombier		print(") ");
42219b2ee8SDavid du Colombier		print("\n\tcalled from ", fmt(frame[1], 'a'), " ");
43219b2ee8SDavid du Colombier		pfl(frame[1]);
44219b2ee8SDavid du Colombier		stk = tail stk;
45219b2ee8SDavid du Colombier		if dolocals then
46219b2ee8SDavid du Colombier			locals(frame[3], frame[0]);
47219b2ee8SDavid du Colombier	}
48219b2ee8SDavid du Colombier}
49219b2ee8SDavid du Colombier
50219b2ee8SDavid du Colombier//defn _stk(pc, sp, dolocals)
51219b2ee8SDavid du Colombier//{
52219b2ee8SDavid du Colombier//	w(__stk(pc, sp, dolocals));
53219b2ee8SDavid du Colombier//}
54219b2ee8SDavid du Colombier
55219b2ee8SDavid du Colombier
56219b2ee8SDavid du Colombierdefn params(param, name)
57219b2ee8SDavid du Colombier{
58219b2ee8SDavid du Colombier	while param do {
59219b2ee8SDavid du Colombier		sym = head param;
60219b2ee8SDavid du Colombier		print("*", fmt(name, 'a'), ":", sym[0], "=", sym[1]);
61219b2ee8SDavid du Colombier		param = tail param;
62219b2ee8SDavid du Colombier		if param then
63219b2ee8SDavid du Colombier			print (",");
64219b2ee8SDavid du Colombier	}
65219b2ee8SDavid du Colombier}
66219b2ee8SDavid du Colombier
67219b2ee8SDavid du Colombierdefn locals(l, name)
68219b2ee8SDavid du Colombier{
69219b2ee8SDavid du Colombier	local sym;
70219b2ee8SDavid du Colombier
71219b2ee8SDavid du Colombier	while l do {
72219b2ee8SDavid du Colombier		sym = head l;
73219b2ee8SDavid du Colombier		print("\t*", fmt(name, 'a'), ":", sym[0], "=", sym[1], "\n");
74219b2ee8SDavid du Colombier		l = tail l;
75219b2ee8SDavid du Colombier	}
76219b2ee8SDavid du Colombier}
77219b2ee8SDavid du Colombier
78219b2ee8SDavid du Colombierdefn bptab()					// print a table of breakpoints
79219b2ee8SDavid du Colombier{
80219b2ee8SDavid du Colombier	local lst, addr;
81219b2ee8SDavid du Colombier
82219b2ee8SDavid du Colombier	lst = bplist;
83219b2ee8SDavid du Colombier	while lst do {
84219b2ee8SDavid du Colombier		addr = head lst;
85219b2ee8SDavid du Colombier		print("\tbpdel(", fmt(addr, 'a'), ")\n");
86219b2ee8SDavid du Colombier		lst = tail lst;
87219b2ee8SDavid du Colombier	}
88219b2ee8SDavid du Colombier}
89219b2ee8SDavid du Colombier
90219b2ee8SDavid du Colombierdefn procs()			// print status of processes
91219b2ee8SDavid du Colombier{
92219b2ee8SDavid du Colombier	local c, lst, cpid;
93219b2ee8SDavid du Colombier
94219b2ee8SDavid du Colombier	cpid = pid;
95219b2ee8SDavid du Colombier	lst = proclist;
96219b2ee8SDavid du Colombier	while lst do {
97219b2ee8SDavid du Colombier		np = head lst;
98219b2ee8SDavid du Colombier		setproc(np);
99219b2ee8SDavid du Colombier		if np == cpid then
100219b2ee8SDavid du Colombier			print(">");
101219b2ee8SDavid du Colombier		print("\t", "setproc(", np, ")\t", status(np), " at ", fmt(*PC, 'a'), "\n");
102219b2ee8SDavid du Colombier		lst = tail lst;
103219b2ee8SDavid du Colombier	}
104219b2ee8SDavid du Colombier	pid = cpid;
105219b2ee8SDavid du Colombier	if pid != 0 then
106219b2ee8SDavid du Colombier		setproc(pid);
107219b2ee8SDavid du Colombier}
108219b2ee8SDavid du Colombier
109*59cc4ca5SDavid du Colombierdefn allstacks()			// print stacks of processes and threads
110*59cc4ca5SDavid du Colombier{
111*59cc4ca5SDavid du Colombier	complex Proc P;
112*59cc4ca5SDavid du Colombier	local T, Tq;
113*59cc4ca5SDavid du Colombier	local c, lst, cpid;
114*59cc4ca5SDavid du Colombier
115*59cc4ca5SDavid du Colombier	cpid = pid;
116*59cc4ca5SDavid du Colombier	P = (Proc)pq.$head;
117*59cc4ca5SDavid du Colombier	while P != 0 do{
118*59cc4ca5SDavid du Colombier		Tq = (Tqueue)P.threads;
119*59cc4ca5SDavid du Colombier		T = (Thread)Tq.$head;
120*59cc4ca5SDavid du Colombier		setproc(P.pid);
121*59cc4ca5SDavid du Colombier		while T != 0 do{
122*59cc4ca5SDavid du Colombier			if(T.cmdname == 0) then taskstk(T, "unknown");
123*59cc4ca5SDavid du Colombier			else taskstk(T, *(T.cmdname\s));
124*59cc4ca5SDavid du Colombier			T = T.nextt;
125*59cc4ca5SDavid du Colombier		}
126*59cc4ca5SDavid du Colombier		P = P.next;
127*59cc4ca5SDavid du Colombier	}
128*59cc4ca5SDavid du Colombier	pid = cpid;
129*59cc4ca5SDavid du Colombier	if pid != 0 then
130*59cc4ca5SDavid du Colombier		setproc(pid);
131*59cc4ca5SDavid du Colombier}
132*59cc4ca5SDavid du Colombier
133219b2ee8SDavid du Colombierprint("/sys/lib/acid/acme");
134