134 lines
2.2 KiB
Text
134 lines
2.2 KiB
Text
|
// 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");
|