Random Mac OS X Coding Tips

  • Darwin’s in-bult malloc(3) memory allocator has a lot of extra features to help you track down memory leaks. It’s no Valgrind nor BoundsChecker (oh how I’d love Valgrind for Mac OS X), but it works quite well in conjunction with the leaks(1) command-line tool. See the malloc(3) manpage for details. Note that this has nothing to do with MallocDebug, which is a separate, much more heavyweight malloc implementation (which is also pretty useless, IMHO).
  • Both static and dynamic linking on Mac OS X is a little complex, partially because of NeXT’s Mach-based baggage, and partially because things such as two-level namespaces aren’t needed as much on Linux, where source-code rather than binary compatibility is the norm. Read and learn the ld(1) manpage for the main system linker, and getting to know the dyld(1) manpage dynamic linker is pretty useful too.
  • You can use the gcc_select command-line tool to switch the default gcc compiler between gcc 2.95, 3.1, 3.3 and 4.0 (all of which are installed with the Xcode developer tools). Note that only gcc 4.0+ will actually compile stuff successfully for x86 architectures, so if you gcc_select back to gcc 3.3 and try to compile pretty much anything, chances are good that it won’t work at all.
  • The ever-useful ldd(1) on Linux, which displays dependencies for object files, is known as otool -L on Mac OS X.
  • Apple’s Shark profiler is, by far, the best profiler I have ever seen on any platform (though I haven’t used Intel’s VTune yet, which I hear is also pretty damn good). If you need to profile anything, take the five minutes to walk through the Shark tutorial, and be blown away by the amount of information it will cheerily give you in one of the best interfaces for a developer tool that I’ve seen.
  • If you’re a command-line junkie and work with Cocoa and Xcode a lot, remember that you can type in open *.xcodeproj to open an Xcode project file in the current directory. I use this so often that I have it as a shell alias named xcode (well, a shell script really, but the different is irrelevant).