acid/kernel: for stacktraces, try to use context from error stack when process is not sleeping
when a process state has not been saved (Proc.mach != nil) then the contents of Proc.sched should be considered invalid. to approximate a stacktrace in this case, we use the error stack and get a stacktrace from the last waserror() call.
This commit is contained in:
parent
fbf29fc695
commit
ca2f1c07f2
1 changed files with 13 additions and 2 deletions
|
@ -271,12 +271,23 @@ defn procstksize(p) {
|
||||||
|
|
||||||
defn procstk(p) {
|
defn procstk(p) {
|
||||||
complex Proc p;
|
complex Proc p;
|
||||||
|
local l, n;
|
||||||
|
|
||||||
if p.state != 0 then { // 0 is Dead
|
if p.state != 0 then { // 0 is Dead
|
||||||
|
if p.mach == 0 then {
|
||||||
|
l = p.sched;
|
||||||
|
} else {
|
||||||
|
n = p.nerrlab;
|
||||||
|
if n == 0 then {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
l = p.errlab + (n-1)*sizeofLabel;
|
||||||
|
}
|
||||||
|
complex Label l;
|
||||||
if objtype=="386" || objtype=="amd64" then
|
if objtype=="386" || objtype=="amd64" then
|
||||||
_stk(gotolabel, p.sched.sp, linkreg(0), 0);
|
_stk(gotolabel, l.sp, linkreg(0), 0);
|
||||||
else
|
else
|
||||||
_stk(p.sched.pc, p.sched.sp, linkreg(0), 0);
|
_stk(l.pc, l.sp, linkreg(0), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue