I vote for gdb. Especially when all you have to work with is a core file.
printf's are nice when you have a general idea where the bug is. But when the test team comes back to you w/ a core file and a weird description of the problem, to be able to analyze the core dump will give you a tremendous head start in your debugging effort.