From 0a61c07d591273b76da21fb8386b669989da3707 Mon Sep 17 00:00:00 2001 From: rsc Date: Mon, 19 Apr 2004 18:18:37 +0000 Subject: acid files --- acid/acme | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 acid/acme (limited to 'acid/acme') diff --git a/acid/acme b/acid/acme new file mode 100644 index 00000000..1cce6eb8 --- /dev/null +++ b/acid/acme @@ -0,0 +1,133 @@ +// support for acme; acid must be run with /acme/acid/$cputype/Acid + + +defn w(*code) +{ + local dir; + + printto("/tmp/acme.acid", eval code); + rc("cat /tmp/acme.acid | wnew -d "+"Acid/-stk'("+itoa(pid)+")'"); +} + +defn procstk(pid, name) +{ + local dir; + + printto("/tmp/acme.acid", stk()); + rc("cat /tmp/acme.acid | wnew -d "+"Acid/-'"+name+"("+itoa(pid)+")'"); +} + +defn taskstk(tid, name) +{ + local dir; + + printto("/tmp/acme.acid", threadstk(tid)); + rc("cat /tmp/acme.acid | wnew -d "+"Acid/-"+name+"'("+itoa(pid)+")'"); +} + +defn _stk(pc, sp, link, dolocals) +{ + local stk; + + print("At pc:", pc, ":", fmt(pc, 'a'), " "); + pfl(pc); + + stk = strace(pc, sp, link); + + while stk do { + frame = head stk; + print(fmt(frame[0], 'a'), "("); + params(frame[2], frame[0]); + print(") "); + print("\n\tcalled from ", fmt(frame[1], 'a'), " "); + pfl(frame[1]); + stk = tail stk; + if dolocals then + locals(frame[3], frame[0]); + } +} + +//defn _stk(pc, sp, dolocals) +//{ +// w(__stk(pc, sp, dolocals)); +//} + + +defn params(param, name) +{ + while param do { + sym = head param; + print("*", fmt(name, 'a'), ":", sym[0], "=", sym[1]); + param = tail param; + if param then + print (","); + } +} + +defn locals(l, name) +{ + local sym; + + while l do { + sym = head l; + print("\t*", fmt(name, 'a'), ":", sym[0], "=", sym[1], "\n"); + l = tail l; + } +} + +defn bptab() // print a table of breakpoints +{ + local lst, addr; + + lst = bplist; + while lst do { + addr = head lst; + print("\tbpdel(", fmt(addr, 'a'), ")\n"); + lst = tail lst; + } +} + +defn procs() // print status of processes +{ + local c, lst, cpid; + + cpid = pid; + lst = proclist; + while lst do { + np = head lst; + setproc(np); + if np == cpid then + print(">"); + print("\t", "setproc(", np, ")\t", status(np), " at ", fmt(*PC, 'a'), "\n"); + lst = tail lst; + } + pid = cpid; + if pid != 0 then + setproc(pid); +} + +defn allstacks() // print stacks of processes and threads +{ + complex Proc P; + local T, Tq; + local c, lst, cpid; + + cpid = pid; + P = (Proc)pq.$head; + while P != 0 do{ + Tq = (Tqueue)P.threads; + T = (Thread)Tq.$head; + setproc(P.pid); + while T != 0 do{ + if(T.cmdname == 0) then taskstk(T, "unknown"); + else taskstk(T, *(T.cmdname\s)); + T = T.nextt; + } + P = P.next; + } + pid = cpid; + if pid != 0 then + setproc(pid); +} + +print(acidfile); -- cgit v1.2.3