Tracing is following all the steps taken by a program, specially function calls/methods, this can be a useful debugging tool when tracking down some problems with your application.
In Ruby we have a tracing tool built-in, we can invoke it with ruby -rtracer script.rb but as you can see here it’s not easy to tell what’s going on:
|
1 2 3 4 5 6 |
#0:test.rb:2::-: def another_call #0:test.rb:7::-: def more_depth #0:test.rb:12::-: def trace_testing(*argv) #0:test.rb:17::-: 3.times do |t| #0:test.rb:18::-: puts trace_testing('abcd',12345 * t, [1,2,3],:test => 'A') #0:test.rb:12:Object:>: def trace_testing(*argv) |
What we can do is implement our own tracer and format the output to our liking, for this Ruby provides us with the set_trace_func method, we setup our tracing by giving this method a proc that will be called for each tracing event.
|
1 2 3 |
set_trace_func proc { |event, file, line, id, binding, classname| printf "%8s %s:%-2d %10s %8sn", event, file, line, id, classname } |
Here is a summary of what each argument means:
- event, this is whats happening in this step of execution, it can be one of the following: “c-return”, “end”, “return”, “c-call”, “line”, “call”, “class”
- file, this is the file where the event happens
- line, the line number
- id, this is the method name we are in
- binding, the current scope where we are running
- classname, this one doesn’t need much explanation

I have made a gem that implements this and focuses on ruby method calls:
|
1 |
gem install simple-tracer |
You can call it with just “st my_script.rb” and this is how it looks:

