1 #!/usr/sbin/dtrace -s 2 /* 3 * This file and its contents are supplied under the terms of the 4 * Common Development and Distribution License ("CDDL"), version 1.0. 5 * You may only use this file in accordance with the terms of version 6 * 1.0 of the CDDL. 7 * 8 * A full copy of the text of the CDDL should have accompanied this 9 * source. A copy of the CDDL is also available via the Internet at 10 * http://www.illumos.org/license/CDDL. 11 */ 12 13 /* 14 * Copyright 2014 Nexenta Systems, Inc. All rights reserved. 15 */ 16 17 /* 18 * User-level dtrace for smbd. Watch everything it does. 19 * Usage: dtrace -s smbd-all.d -p `pgrep smbd` 20 */ 21 22 #pragma D option flowindent 23 24 self int trace; 25 self int mask; 26 27 /* 28 * Trace everything in smbd 29 */ 30 pid$target:*smbd::entry, 31 pid$target:libmlsvc.so.1::entry, 32 pid$target:libmlrpc.so.1::entry, 33 pid$target:libsmbns.so.1::entry, 34 pid$target:libsmb.so.1::entry, 35 pid$target:libads.so.1::entry 36 { 37 self->trace++; 38 } 39 40 /* 41 * If traced and not masked, print entry/return 42 */ 43 pid$target:*smbd::entry, 44 pid$target:libmlsvc.so.1::entry, 45 pid$target:libmlrpc.so.1::entry, 46 pid$target:libsmbns.so.1::entry, 47 pid$target:libsmb.so.1::entry, 48 pid$target:libads.so.1::entry 49 /self->trace > 0 && self->mask == 0/ 50 { 51 printf("\t0x%x", arg0); 52 printf("\t0x%x", arg1); 53 printf("\t0x%x", arg2); 54 printf("\t0x%x", arg3); 55 printf("\t0x%x", arg4); 56 printf("\t0x%x", arg5); 57 } 58 59 /* 60 * Mask (don't print) all function calls below these functions. 61 * These make many boring, repetitive function calls like 62 * smb_mbtowc, smb_msgbuf_has_space, ... 63 * 64 * Also, libmlrpc has rather deep call stacks, particularly under 65 * ndr_encode_decode_common(), so this stops traces below there. 66 * Remove that from the mask actions to see the details. 67 */ 68 pid$target::ht_findfirst:entry, 69 pid$target::ht_findnext:entry, 70 pid$target::ndr_encode_decode_common:entry, 71 pid$target::smb_msgbuf_decode:entry, 72 pid$target::smb_msgbuf_encode:entry, 73 pid$target::smb_strlwr:entry, 74 pid$target::smb_strupr:entry, 75 pid$target::smb_wcequiv_strlen:entry 76 { 77 self->mask++; 78 } 79 80 /* 81 * Get some of the smbd debug messages, etc. 82 */ 83 pid$target:libsmb.so.1:smb_trace:entry 84 /self->trace > 0 && self->mask == 0/ 85 { 86 printf("%s", copyinstr(arg0)); 87 } 88 89 pid$target:libsmb.so.1:smb_syslog:entry 90 /self->trace > 0 && self->mask == 0/ 91 { 92 printf("%s", copyinstr(arg1)); 93 } 94 95 pid$target:libc_hwcap1.so.1:syslog:entry 96 /self->trace > 0 && self->mask == 0/ 97 { 98 printf("%s", copyinstr(arg1)); 99 } 100 101 /* 102 * Now inverses of above, unwind order. 103 */ 104 105 pid$target::ht_findfirst:return, 106 pid$target::ht_findnext:return, 107 pid$target::ndr_encode_decode_common:return, 108 pid$target::smb_msgbuf_decode:return, 109 pid$target::smb_msgbuf_encode:return, 110 pid$target::smb_strlwr:return, 111 pid$target::smb_strupr:return, 112 pid$target::smb_wcequiv_strlen:return 113 { 114 self->mask--; 115 } 116 117 pid$target:*smbd::return, 118 pid$target:libmlsvc.so.1::return, 119 pid$target:libmlrpc.so.1::return, 120 pid$target:libsmbns.so.1::return, 121 pid$target:libsmb.so.1::return, 122 pid$target:libads.so.1::return 123 /self->trace > 0 && self->mask == 0/ 124 { 125 printf("\t0x%x", arg1); 126 } 127 128 pid$target:*smbd::return, 129 pid$target:libmlsvc.so.1::return, 130 pid$target:libmlrpc.so.1::return, 131 pid$target:libsmbns.so.1::return, 132 pid$target:libsmb.so.1::return, 133 pid$target:libads.so.1::return 134 { 135 self->trace--; 136 } 137