DTrace

Crowd-sourced documentation and tutorials by the Cocoa developer community
Jump to: navigation, search

DTrace is a dynamic tracing facility originating at Sun which ships with Mac OS X Leopard. Given its incredible utility to developers and the fact that there is an ObjC provider (making it easy to probe ObjC methods), I thought we should start putting some information on how to use it in debugging, measuring, and exploring your Cocoa programs. I'll start off:

I'm using the following dtrace invocation on the command-line to print the stack trace of any exceptions:

dtrace -n "pid\$target::objc_exception_throw:entry { ustack() }" -p PID_OF_PROGRAM_UNDER_INSPECTION

Since I frequently relaunch the app between runs of dtrace, I find it convenient to use a bit of shell magic to grab the pid of the process I want:

dtrace � -p $(ps axc|grep MyApp|awk '{print $1}')

More conveniently, you can put this into a bash function:

function pid { ps axc | grep "$1" | awk '{print $1}' }

and use it more succinctly in your dtrace call:

dtrace � -p $(pid MyApp)


See also http://www.mactech.com/articles/mactech/Vol.23/23.11/ExploringLeopardwithDTrace/index.html for a very pleasant introduction to dtrace by Greg Miller. -- RobRix


ustack() outputs a stack trace with lines like this:

Chromosome`-[[[ChromSceneView]](ChromSceneViewDrawing) drawRect:]+0xb0

Does anybody know how to get a line number from that (presumably from the 0xb0 bit)? Would I be better off telling dtrace not to look up the symbolic name for the address in the trace (assuming that's even possible!) and looking it up myself with atos? -- RobRix


Does anybody know how to make dtrace run an app as a non-root user? I'm trying to run soemthing like: sudo dtrace -s somecode.d -c /path/to/myApp.app/Contents/MacOS/myApp Except it runs myApp as root, I need to run myApp as another user. Everything I've found online for this seems to be Sun specific. (usermod, etc)

Personal tools
Namespaces

Variants
Actions
Navigation
Toolbox