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