Here's how I tracked this down.
First, I went all over the place using:
NSLog(@"%s", __PRETTY_FUNCTION__, nil);
in order to get as close as possible to the crash. As I did that I happened to notice that it looked like an object was becoming null that shouldn't have been.
At this point, GDB with NSZombieEnabled and Instruments both reported NO zombies.
I added the NSLog-ing to the dealloc and release methods of the object I was having a problem with. Finally I was able to get enough sense to add a breakpoint in those methods and look at the stacktrace each time, when I found that release was being called by the autorelease pool.
I finally figured out that I wasn't retaining something that I should have been. Once I retained it, bingo, problem solved.
That said, the NSZombieEnabled and Instruments recommendations have both helped with some other bugs that have cropped up since then, so thanks everyone.