|  | // 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); |