Diagnosing Ruby require_relative issues with DTrace on OSX
Ruby, like many programming languages, has a C-like mechanism for using code defined in other files. It’s critical for the development of any serious program, but it’s also prone to weird errors when files aren’t included in the proper order, or not included at all. It’s usually pretty obvious which file you’re not require_relative
ing, but there are times when the only way to make sense of things is to trace the system calls.
On Windows, Process Monitor is by far the best way to diagnose this sort of problem. It gives a useful trace of just about everything a process does. I’ve used it many times before to diagnose file loading issues, and weird compiler errors. Similarly, strace on Linux traces every system call.
But what about OSX?
OSX has it’s own tracing utility (well, it was ported to OSX) called DTrace. It’s an awful lot like strace, and honestly, I’d have trouble noticing the differences in the outputs if you didn’t tell me so.
DTrace is kinda awkward to use on it’s own, so it comes with a whole bunch of scripts (archived) to help you find the information that you’re looking for. Here, I’m using the opensnoop script.
Usage is pretty simple. “sudo opensnoop -n ruby”, and then you run your ruby application in a different window. You’ll get an output like this:

Trust me, most of that doesn’t matter right now.
I’m running a really basic and contrived application, where I’m failing to include a file before using functions in that file. There’s still an awful lot going on, because modern computers are built on the shoulders of giants. See also:
ANYWAYS
Running opensnoop will likely produce several terminal-pages of output, but don’t worry too much about that. It’s normal for an interpreted language to be doing an awful lot of file reads when initializing the standard library and execution environment. What we’re interested is towards the end:
See towards the bottom where it opens bin/run.rb
? That’s where ruby is actually starting to parse my code. Everything after that is gonna be the require_relative
s.
First, ruby hits the require_relative
for environment.rb
, and then begins parsing that one. Since environment.rb
has a require_relative
for file_one.rb
, ruby opens that file. Since environment.rb
` has a require_relative
for file_two.rb
…it should open that file?

In software, the answer to “which idiot did that” is almost always “you did”.
And there’s the problem. <span style="color:var(--color-text);">require_relative "app/file_two.rb"
in file_two.rb is commented out. Which idiot did that? Probably me.
Code is available on my alternate (for a school account) GitHub here: https://github.com/ariccio-learn-co-alternate/june_blog_repo