PERFORCE change 103833 for review
Howard Su
howardsu at FreeBSD.org
Mon Aug 14 12:42:58 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=103833
Change 103833 by howardsu at su_vm on 2006/08/14 12:42:22
Change the behavir of SCE/SCX. It just set the flag
of the p_stop. It will not change the state of tracing
process anymore.
Affected files ...
.. //depot/projects/dtrace/src/sys/kern/sys_process.c#7 edit
.. //depot/projects/dtrace/src/usr.bin/truss/setup.c#7 edit
Differences ...
==== //depot/projects/dtrace/src/sys/kern/sys_process.c#7 (text+ko) ====
@@ -721,9 +721,6 @@
case PT_STEP:
case PT_CONTINUE:
- case PT_TO_SCE:
- case PT_TO_SCX:
- case PT_SYSCALL:
case PT_DETACH:
/* Zero means do not send any signal */
if (data < 0 || data > _SIG_MAXSIG) {
@@ -731,21 +728,10 @@
break;
}
- switch (req) {
- case PT_STEP:
+ if (req == PT_STEP) {
error = ptrace_single_step(td2);
if (error)
goto out;
- break;
- case PT_TO_SCE:
- p->p_stops |= S_PT_SCE;
- break;
- case PT_TO_SCX:
- p->p_stops |= S_PT_SCX;
- break;
- case PT_SYSCALL:
- p->p_stops |= S_PT_SCE | S_PT_SCX;
- break;
}
if (addr != (void *)1) {
@@ -817,6 +803,30 @@
break;
+ case PT_TO_SCE:
+ if (data == -1)
+ p->p_stops &= ~S_PT_SCE;
+ else
+ p->p_stops |= S_PT_SCE;
+ break;
+ case PT_TO_SCX:
+ if (data == -1)
+ p->p_stops &=~S_PT_SCE;
+ else
+ p->p_stops |= S_PT_SCX;
+ break;
+ case PT_SYSCALL:
+ if (data == -1)
+ p->p_stops &=~S_PT_SCE | ~S_PT_SCX;
+ else
+ p->p_stops |= S_PT_SCE | S_PT_SCX;
+ break;
+ case PT_FFORK:
+ if (data == -1)
+ p->p_stops &= ~S_PT_FFORK;
+ else
+ p->p_stops |= S_PT_FFORK;
+ break;
case PT_WRITE_I:
case PT_WRITE_D:
write = 1;
==== //depot/projects/dtrace/src/usr.bin/truss/setup.c#7 (text+ko) ====
@@ -84,6 +84,7 @@
waitpid(pid, NULL, WNOHANG);
/* Only in the parent here */
+ ptrace(PT_SYSCALL, pid, NULL, 0);
return (pid);
}
@@ -98,6 +99,7 @@
{
if (ptrace(PT_ATTACH, pid, NULL, 0))
err(1, "can not attach to target process");
+ ptrace(PT_SYSCALL, pid, NULL, 0);
return (0);
}
@@ -118,14 +120,14 @@
int waitval;
struct ptrace_lwpinfo lwpinfo;
- ptrace(PT_SYSCALL, info->pid, (caddr_t)1, 0);
- if (waitpid(info->pid, &waitval, WNOHANG) == -1) {
+ ptrace(PT_CONTINUE, info->pid, (caddr_t)1, 0);
+ if (waitpid(info->pid, &waitval, 0) == -1) {
switch (errno)
{
case EINTR:
break;
default:
- err(1, "failed");
+ err(1, "failed wait pid");
}
}
if (WIFCONTINUED(waitval)) {
@@ -144,17 +146,17 @@
switch(lwpinfo.pl_event) {
case PL_EVENT_SYSENTER:
info->pr_why = S_SCE;
- break;
- case PL_EVENT_SYSEXIT:
- info->pr_why = S_SCX;
- break;
- case PL_EVENT_SIGNAL:
- info->pr_why = S_SIG;
- info->pr_data = lwpinfo.pl_signal;
- break;
- default:
- info->pr_why = S_NONE;
- }
+ break;
+ case PL_EVENT_SYSEXIT:
+ info->pr_why = S_SCX;
+ break;
+ case PL_EVENT_SIGNAL:
+ info->pr_why = S_SIG;
+ info->pr_data = lwpinfo.pl_signal;
+ break;
+ default:
+ info->pr_why = S_NONE;
+ }
return;
}
}
More information about the p4-projects
mailing list