Conditional breakpoints that run a script and continue can be used equivalently to printf debugging, just set it to print when the selected line is hit. You can do this without restarting the application, even for multithreaded code.
Also watchpoints, for the equivalent but at a memory location instead of a code line.