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:
cinap_lenrek 2019-09-12 15:28:04 +02:00
parent fbf29fc695
commit ca2f1c07f2

View file

@ -271,12 +271,23 @@ defn procstksize(p) {
defn procstk(p) {
complex Proc p;
local l, n;
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
_stk(gotolabel, p.sched.sp, linkreg(0), 0);
_stk(gotolabel, l.sp, linkreg(0), 0);
else
_stk(p.sched.pc, p.sched.sp, linkreg(0), 0);
_stk(l.pc, l.sp, linkreg(0), 0);
}
}