Assuming I can, I always study code with a debugger and various simplification techniques (say throw in `abort()` or raise an exception to get a stack trace or throw in `printf()` on interesting objects). Usually I just start it up with `gdb ./program` and step through and see where it takes me. If the code is complex enough, I'll even start ripping out parts to see where it's required (often it's not in whatever simple case you're interested in).
If I can't use a debugger (i.e. my initial assumption fails), I usually run for the hills...
If I can't use a debugger (i.e. my initial assumption fails), I usually run for the hills...