123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- // 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("/sys/lib/acid/acme");
|