[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では直ってますか?