Debugging Universal applications in Rosetta
Apple have a guide on debugging PowerPC binaries on an Intel-based Macintosh. Unfortunately, those instructions do not work if the application is a Universal Binary.
If Xcode’s build settings dialog hadn’t gone from kinda bad to utterly screwy, it might have been easiest just to temporarily edit your application target’s build settings to build just ppc. As an alternative, you can use the following steps to debug the PPC code of a Universal binary on an Intel Mac:
- First, make sure your Debug version of your application’s target is set to include the ppc architecture. It may be set to just the “Native Architecture” to speed up normal debug builds.
- You will need the OAH_GDB environment variable set. In bash, use:
export OAH_GDB=YES
. - Instead of running your application directly as Apple’s reference states, use
/usr/libexec/oah/translate /<path>/<your_application>.app/Contents/MacOS/<your_application>
from the shell in which you set the OAH_GDB flag. - Open another terminal tab and start gdb using
gdb --oah
. - Instead of attaching to <your_application>, you will need to attach to the “translate” process that’s running your app. GDB may autocomplete the whole thing if you press Tab after typing just “attach “.
- Now use gdb’s
c
command to Continue (or start, in this case) execution. Prepare for extremely slow execution, since your app is running under both Rosetta and the debugger.
Note that only the odd numbered steps, especially steps 3 and 5, differ from Apple’s instructions. Since it’s a Universal Binary, you have to force PPC behaviour by manually starting your application in the Rosetta translator.
Whichever method (compiling ppc-only or running via translate) you like better, you will likely want to load your app’s symbols with the gdb command symbol-file /<path>/<your_application>.app/Contents/MacOS/<your_application>
. If you’re like me and generally inept with raw gdb, you may find the tips and links Apple’s Using GDB for Testing article to be a good starting guide for learning your way around gdb. There are some caveats to debugging under Rosetta mentioned in the first Apple guide, especially that you can’t call functions. Of course, I didn’t realize that was even possible, so I guess I’ll have to try that when I’m debugging normally sometime!
You can also use the arch command to start a process using a certain architecture set in the mach-o binary. See man arch(1).
JP
Comment by John — June 9, 2008 @ 12:28 pm
[...] running Rosetta is not trivial. Fortunately, it is possible—a little googling leads one to this blog post and the Universal Binary Programming Guidelines, which detail the procedure. Run the binary with [...]
Pingback by The Spoony Blog » I’ll take Pwtent Pwnables for 400 please, Alex — May 26, 2010 @ 7:11 pm