Leveraging Print Debugging to Improve Code Generation in Large Language Models