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