xref: /plan9/sys/lib/acid/acme (revision 59cc4ca53493a3c6d2349fe2b7f7c40f7dce7294)
1// support for acme; acid must be run with /acme/acid/$cputype/Acid
2
3
4defn w(*code)
5{
6	local dir;
7
8	printto("/tmp/acme.acid", eval code);
9	rc("cat /tmp/acme.acid | wnew -d "+"Acid/-stk'("+itoa(pid)+")'");
10}
11
12defn procstk(pid, name)
13{
14	local dir;
15
16	printto("/tmp/acme.acid", stk());
17	rc("cat /tmp/acme.acid | wnew -d "+"Acid/-'"+name+"("+itoa(pid)+")'");
18}
19
20defn taskstk(tid, name)
21{
22	local dir;
23
24	printto("/tmp/acme.acid", threadstk(tid));
25	rc("cat /tmp/acme.acid | wnew -d "+"Acid/-"+name+"'("+itoa(pid)+")'");
26}
27
28defn _stk(pc, sp, link, dolocals)
29{
30	local stk;
31
32	print("At pc:", pc, ":", fmt(pc, 'a'), " ");
33	pfl(pc);
34
35	stk = strace(pc, sp, link);
36
37	while stk do {
38		frame = head stk;
39		print(fmt(frame[0], 'a'), "(");
40		params(frame[2], frame[0]);
41		print(") ");
42		print("\n\tcalled from ", fmt(frame[1], 'a'), " ");
43		pfl(frame[1]);
44		stk = tail stk;
45		if dolocals then
46			locals(frame[3], frame[0]);
47	}
48}
49
50//defn _stk(pc, sp, dolocals)
51//{
52//	w(__stk(pc, sp, dolocals));
53//}
54
55
56defn params(param, name)
57{
58	while param do {
59		sym = head param;
60		print("*", fmt(name, 'a'), ":", sym[0], "=", sym[1]);
61		param = tail param;
62		if param then
63			print (",");
64	}
65}
66
67defn locals(l, name)
68{
69	local sym;
70
71	while l do {
72		sym = head l;
73		print("\t*", fmt(name, 'a'), ":", sym[0], "=", sym[1], "\n");
74		l = tail l;
75	}
76}
77
78defn bptab()					// print a table of breakpoints
79{
80	local lst, addr;
81
82	lst = bplist;
83	while lst do {
84		addr = head lst;
85		print("\tbpdel(", fmt(addr, 'a'), ")\n");
86		lst = tail lst;
87	}
88}
89
90defn procs()			// print status of processes
91{
92	local c, lst, cpid;
93
94	cpid = pid;
95	lst = proclist;
96	while lst do {
97		np = head lst;
98		setproc(np);
99		if np == cpid then
100			print(">");
101		print("\t", "setproc(", np, ")\t", status(np), " at ", fmt(*PC, 'a'), "\n");
102		lst = tail lst;
103	}
104	pid = cpid;
105	if pid != 0 then
106		setproc(pid);
107}
108
109defn allstacks()			// print stacks of processes and threads
110{
111	complex Proc P;
112	local T, Tq;
113	local c, lst, cpid;
114
115	cpid = pid;
116	P = (Proc)pq.$head;
117	while P != 0 do{
118		Tq = (Tqueue)P.threads;
119		T = (Thread)Tq.$head;
120		setproc(P.pid);
121		while T != 0 do{
122			if(T.cmdname == 0) then taskstk(T, "unknown");
123			else taskstk(T, *(T.cmdname\s));
124			T = T.nextt;
125		}
126		P = P.next;
127	}
128	pid = cpid;
129	if pid != 0 then
130		setproc(pid);
131}
132
133print("/sys/lib/acid/acme");
134