]> git.lizzy.rs Git - plan9front.git/commitdiff
acid/kernel: for stacktraces, try to use context from error stack when process is...
authorcinap_lenrek <cinap_lenrek@felloff.net>
Thu, 12 Sep 2019 13:28:04 +0000 (15:28 +0200)
committercinap_lenrek <cinap_lenrek@felloff.net>
Thu, 12 Sep 2019 13:28:04 +0000 (15:28 +0200)
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.

sys/lib/acid/kernel

index 4cf57ba714181109352a23a139472b0dc2546728..c6433b9da63b3b635b80c00584410a84ee5179dd 100644 (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);
        }
 }