19f4c7ba4SPedro F. Giffuni# 29f4c7ba4SPedro F. Giffuni# CDDL HEADER START 39f4c7ba4SPedro F. Giffuni# 49f4c7ba4SPedro F. Giffuni# The contents of this file are subject to the terms of the 59f4c7ba4SPedro F. Giffuni# Common Development and Distribution License (the "License"). 69f4c7ba4SPedro F. Giffuni# You may not use this file except in compliance with the License. 79f4c7ba4SPedro F. Giffuni# 89f4c7ba4SPedro F. Giffuni# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 99f4c7ba4SPedro F. Giffuni# or http://www.opensolaris.org/os/licensing. 109f4c7ba4SPedro F. Giffuni# See the License for the specific language governing permissions 119f4c7ba4SPedro F. Giffuni# and limitations under the License. 129f4c7ba4SPedro F. Giffuni# 139f4c7ba4SPedro F. Giffuni# When distributing Covered Code, include this CDDL HEADER in each 149f4c7ba4SPedro F. Giffuni# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 159f4c7ba4SPedro F. Giffuni# If applicable, add the following below this CDDL HEADER, with the 169f4c7ba4SPedro F. Giffuni# fields enclosed by brackets "[]" replaced with your own identifying 179f4c7ba4SPedro F. Giffuni# information: Portions Copyright [yyyy] [name of copyright owner] 189f4c7ba4SPedro F. Giffuni# 199f4c7ba4SPedro F. Giffuni# CDDL HEADER END 209f4c7ba4SPedro F. Giffuni# 219f4c7ba4SPedro F. Giffuni 229f4c7ba4SPedro F. Giffuni# 239f4c7ba4SPedro F. Giffuni# Copyright (c) 2011, Joyent, Inc. All rights reserved. 249f4c7ba4SPedro F. Giffuni# 259f4c7ba4SPedro F. Giffuni 269f4c7ba4SPedro F. Giffuniif [ $# != 1 ]; then 279f4c7ba4SPedro F. Giffuni echo expected one argument: '<'dtrace-path'>' 289f4c7ba4SPedro F. Giffuni exit 2 299f4c7ba4SPedro F. Giffunifi 309f4c7ba4SPedro F. Giffuni 319f4c7ba4SPedro F. Giffunidtrace=$1 329f4c7ba4SPedro F. GiffuniDIR=/var/tmp/dtest.$$ 339f4c7ba4SPedro F. Giffuni 349f4c7ba4SPedro F. Giffunimkdir $DIR 359f4c7ba4SPedro F. Giffunicd $DIR 369f4c7ba4SPedro F. Giffuni 379f4c7ba4SPedro F. Giffunicat > test.c <<EOF 389f4c7ba4SPedro F. Giffuni#include <unistd.h> 399f4c7ba4SPedro F. Giffuni#include <sys/sdt.h> 409f4c7ba4SPedro F. Giffuni 419f4c7ba4SPedro F. Giffuniint 429f4c7ba4SPedro F. Giffunimain(int argc, char **argv) 439f4c7ba4SPedro F. Giffuni{ 449f4c7ba4SPedro F. Giffuni DTRACE_PROBE(test_prov, probe1); 459f4c7ba4SPedro F. Giffuni} 469f4c7ba4SPedro F. GiffuniEOF 479f4c7ba4SPedro F. Giffuni 489f4c7ba4SPedro F. Giffunicat > prov.d <<EOF 499f4c7ba4SPedro F. Giffuniprovider test_prov { 509f4c7ba4SPedro F. Giffuni probe probe1(); 519f4c7ba4SPedro F. Giffuni}; 529f4c7ba4SPedro F. GiffuniEOF 539f4c7ba4SPedro F. Giffuni 54d0403385SMark Johnstoncc -c test.c 559f4c7ba4SPedro F. Giffuniif [ $? -ne 0 ]; then 569f4c7ba4SPedro F. Giffuni print -u2 "failed to compile test.c" 579f4c7ba4SPedro F. Giffuni exit 1 589f4c7ba4SPedro F. Giffunifi 59*c5af5adaSMark Johnston$dtrace -G -s prov.d test.o 609f4c7ba4SPedro F. Giffuniif [ $? -ne 0 ]; then 619f4c7ba4SPedro F. Giffuni print -u2 "failed to create DOF" 629f4c7ba4SPedro F. Giffuni exit 1 639f4c7ba4SPedro F. Giffunifi 64d0403385SMark Johnstoncc -o test test.o prov.o 659f4c7ba4SPedro F. Giffuniif [ $? -ne 0 ]; then 669f4c7ba4SPedro F. Giffuni print -u2 "failed to link final executable" 679f4c7ba4SPedro F. Giffuni exit 1 689f4c7ba4SPedro F. Giffunifi 699f4c7ba4SPedro F. Giffuni 709f4c7ba4SPedro F. Giffuniscript() 719f4c7ba4SPedro F. Giffuni{ 729f4c7ba4SPedro F. Giffuni $dtrace -Zwqs /dev/stdin <<EOF 739f4c7ba4SPedro F. Giffuni test_prov*::: 749f4c7ba4SPedro F. Giffuni { 759f4c7ba4SPedro F. Giffuni probeid = id; 769f4c7ba4SPedro F. Giffuni } 779f4c7ba4SPedro F. Giffuni 789f4c7ba4SPedro F. Giffuni tick-1sec 799f4c7ba4SPedro F. Giffuni /probeid == 0/ 809f4c7ba4SPedro F. Giffuni { 819f4c7ba4SPedro F. Giffuni printf("launching test\n"); 829f4c7ba4SPedro F. Giffuni system("./test"); 839f4c7ba4SPedro F. Giffuni } 849f4c7ba4SPedro F. Giffuni 859f4c7ba4SPedro F. Giffuni tick-1sec 869f4c7ba4SPedro F. Giffuni /probeid != 0/ 879f4c7ba4SPedro F. Giffuni { 889f4c7ba4SPedro F. Giffuni printf("attempting re-enabling\n"); 899f4c7ba4SPedro F. Giffuni system("dtrace -e -x errtags -i %d", probeid); 909f4c7ba4SPedro F. Giffuni attempts++; 919f4c7ba4SPedro F. Giffuni } 929f4c7ba4SPedro F. Giffuni 939f4c7ba4SPedro F. Giffuni tick-1sec 949f4c7ba4SPedro F. Giffuni /attempts > 10/ 959f4c7ba4SPedro F. Giffuni { 969f4c7ba4SPedro F. Giffuni exit(0); 979f4c7ba4SPedro F. Giffuni } 989f4c7ba4SPedro F. GiffuniEOF 999f4c7ba4SPedro F. Giffuni} 1009f4c7ba4SPedro F. Giffuni 1019f4c7ba4SPedro F. Giffuniscript 2>&1 | tee test.out 1029f4c7ba4SPedro F. Giffuni 1039f4c7ba4SPedro F. Giffuni# 1049f4c7ba4SPedro F. Giffuni# It should be true that our probe was reaped over the course of the enabling, 1059f4c7ba4SPedro F. Giffuni# causing the embedded DTrace invocation to fail on an invalid probe (that is, 1069f4c7ba4SPedro F. Giffuni# D_PDESC_INVAL) instead of an inability to grab the underlying process 1079f4c7ba4SPedro F. Giffuni# (D_PROC_GRAB). 1089f4c7ba4SPedro F. Giffuni# 1099f4c7ba4SPedro F. Giffunigrep D_PDESC_INVAL test.out 2> /dev/null 1>&2 1109f4c7ba4SPedro F. Giffunistatus=$? 1119f4c7ba4SPedro F. Giffuni 1129f4c7ba4SPedro F. Giffunicd / 1132c4c1a26SMark Johnstonrm -rf $DIR 1149f4c7ba4SPedro F. Giffuni 1159f4c7ba4SPedro F. Giffuniexit $status 116