[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

single-step error



斉藤@densanと言います。1.5.2で質問があります。

以下の症状は、皆さんのところでは、起こっていないでしょうか。
何かアドバイスいただけると幸いです。

gdbを使ってプログラムのトレースを行なっていると、
一行実行時、PCが移動しなくなることがあります。

原因は、CPUのsingle step実行機能を使っての一命令実行時、
SIGARRMのようなシグナルがあると、single stepしたい命令でなく、
シグナル処理コードの最初のコードが実行され、
sigreturn時に、再度single stepしてしまいます(sendsig()参照)。

しかしsigreturn時のsingle stepで実行されるアドレスには、
すでにブレークポイントが埋め込まれています。

この症状を避けるために、single step実行したい場合は、
signal処理をしないようにして対策してみました。

sys/arch/powerpc/powerpc/trap.c

   330      /* take pending signals */
   331      {
   332          int sig;
   333
   334          while (sig = CURSIG(p))
   335              postsig(sig);
   336      }
   337
   338      p->p_priority = p->p_usrpri;
   339      if (want_resched) {
   340          int sig;
   341          /*
   342           * We are being preempted.
   343           */
   344          preempt(NULL);
   345          while (sig = CURSIG(p))
   346              postsig(sig);
   347      }

を

   330      /* take pending signals */
   331      {
   332          int sig;
   333
   334          while (sig = CURSIG(curproc)) {
   335              if (trapframe(curproc)->srr1 & PSL_SE)
   336                  break;
   337              postsig(sig);
   338          }
   339      }
   340
   341      p->p_priority = p->p_usrpri;
   342      if (want_resched) {
   343          int sig;
   344          /*
   345           * We are being preempted.
   346           */
   347          preempt(NULL);
   348          while (sig = CURSIG(curproc)) {
   349              if (trapframe(curproc)->srr1 & PSL_SE)
   350                  break;
   351              postsig(sig);
   352          }
   353      }

のように変えたら、症状がでなくなりました。
currentでは直ってますか?