"printf("line: %d \n", __LINE__);" does not work on System Workbench
OK. It looks that you need to learn how to search around to find information you need.
Basically the ARM semihosting need to have the debugger semihosting channel connected, or the firmware will hanging. The best practice to deal this issue is to wrap your printf with a compiler option for debugging, and undefine this compiler option while build for release/Run.
I’m using my spare time to do the research to try to find a better way to deal this issue, aka. detect the status of debugger’s semihosting channel connection, and then to send the data over or drop them. The progress is quite slow and I don’t think I can make it soon.