tacme - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tacme (2279B)
       ---
            1 // support for acme; acid must be run with /acme/acid/$cputype/Acid
            2 
            3 
            4 defn 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 
           12 defn 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 
           20 defn 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 
           28 defn _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 
           56 defn 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 
           67 defn 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 
           78 defn 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 
           90 defn 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 
          109 defn 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 
          133 print(acidfile);