22
Introduction to DTrace Frank Lefebvre CocoaHeads Paris November 2016 @franklefebvre

Découvrir dtrace en ligne de commande

Embed Size (px)

Citation preview

Page 1: Découvrir dtrace en ligne de commande

Introduction to DTrace

Frank Lefebvre

CocoaHeads Paris November 2016 @franklefebvre

Page 2: Découvrir dtrace en ligne de commande

About DTrace• Overview

• History

• Dynamic: providers, consumers

• Systemwide

• Zero disable cost

Page 3: Découvrir dtrace en ligne de commande

Security considerations• Privileges

• dtrace: root

• Instruments: requests admin password

• Restrictions

• Supported platforms

• System Integrity Protection

Page 4: Découvrir dtrace en ligne de commande

System Integrity Protection• Your applications on a development system

• It just works

• Your applications in production

• com.apple.security.get-task-allow entitlement

• or disable System Integrity Protection

• Other executables

• Disable System Integrity Protection

Page 5: Découvrir dtrace en ligne de commande

Disabling SIP• Check current status

csrutil status

• Reboot in Recovery mode

csrutil enable --without dtrace

csrutil disable

csrutil clear

Page 6: Découvrir dtrace en ligne de commande

Probe specifiers

• probe ID

• provider:module:function:name

• wildcards

• escaping

Page 7: Découvrir dtrace en ligne de commande

Providers• General providers

• syscall, fbt, io, pid, profile…

• Language providers

• objc_runtime, python, sh…

• Special probes

• dtrace:::BEGIN, dtrace:::END

Page 8: Découvrir dtrace en ligne de commande

DTrace one-liners• probes

'syscall::open*:entry, syscall::open*:return'

• probes {actions}

'syscall::open*:entry {printf("%s\n", copyinstr(arg0));}'

• probes /predicate/ {actions}

'syscall::open*:entry /execname == "Safari"/ {printf("%s\n", copyinstr(arg0));}'

Page 9: Découvrir dtrace en ligne de commande

Using one-liners• Run globally

dtrace -n (program)

• Attach to existing process

dtrace -n (program) -p (pid)

• Launch executable (restrictions apply)

dtrace -n (program) -c (command)

Page 10: Découvrir dtrace en ligne de commande

Hello, World!#!/usr/sbin/dtrace -s

#pragma D option quiet

dtrace:::BEGIN

{

printf("Hello World!\n");

exit(0);

}

Page 11: Découvrir dtrace en ligne de commande

Structure of a D program#!/usr/sbin/dtrace -s

provider:module:function:name

/predicate/

{

action statement;

action statement;

}

Header

Clause

Clause

Page 12: Découvrir dtrace en ligne de commande

Action statements• C-like syntax

• No control flow

• No function definitions

• Variables

• Built-in variables

Page 13: Découvrir dtrace en ligne de commande

Aggregations• Simple aggregation

@variable = function(…);

• Key-based aggregation

@variable[key] = function(…);

• Aggregating functions

count, sum, avg, min, max, quantize…

Page 14: Découvrir dtrace en ligne de commande

Top 5 processes#!/usr/sbin/dtrace -s

#pragma D option quiet

profile:::tick-1001

{

@counters[execname] = count();

}

profile:::tick-1sec

{

trunc(@counters, 5);

printf("\n");

printa("%s --> %@d\n", @counters);

trunc(@counters);

}

Page 15: Découvrir dtrace en ligne de commande

Creating your own probes• Create provider definition file

• Generate C header file

• Import in Objective-C code

• Add probe macros to source code

• Profit!

Page 16: Découvrir dtrace en ligne de commande

Create provider definition file

/* provider.d */

provider cocoaheads {

probe some_action(int);

probe another_action(char*);

};

Page 17: Découvrir dtrace en ligne de commande

Generate header filedtrace -h -s provider.d

/* provider.h */

COCOAHEADS_SOME_ACTION()

COCOAHEADS_SOME_ACTION_ENABLED()

COCOAHEADS_ANOTHER_ACTION()

COCOAHEADS_ANOTHER_ACTION_ENABLED()

Page 18: Découvrir dtrace en ligne de commande

Add probe macros#import "provider.h"

COCOAHEADS_SOME_ACTION(value);

if (COCOAHEADS_ANOTHER_ACTION_ENABLED()) {

NSString* s = some_expensive_call();

COCOAHEADS_ANOTHER_ACTION([s UTF8String]);

}

Page 19: Découvrir dtrace en ligne de commande

Using your probes in Swift code// File: provider_functions.h

#import "provider.h"

static inline void CocoaHeadsSomeAction(int arg) {

COCOAHEADS_SOME_ACTION(arg);

}

Page 20: Découvrir dtrace en ligne de commande

Your custom probe in DTrace• Provider: cocoaheads<pid>

• Module: <your executable name>

• Function: CocoaHeadsSomeAction

• Name: some_action

• Arg0: <value>

Page 21: Découvrir dtrace en ligne de commande

Recap

CocoaHeads Paris November 2016 @franklefebvre

Page 22: Découvrir dtrace en ligne de commande

Q&A

CocoaHeads Paris November 2016 @franklefebvre