In this chapter, we have learned about the importance of troubleshooting, why developers are struggling with troubleshooting, and how to set up the right environment to troubleshoot your application. Furthermore, we looked into the importance of error handling and how it can help to identify the problematic areas and why developers should incorporate error handling in their day-to-day development. Then we learned the other helpful part of error handling, which is logging. We have seen how to create a logger and use the appropriate message level. We have also explored various other logging libraries that we can use in our application development. After that, we learned two important techniques in troubleshooting--thread dump and heap dump.
In the next chapter, we will explore the role of profiling and how it is useful to you as a developer to improve the performance of...