Once you know that there's a bug in your code, figuring out which part of your code is responsible is often a difficult process. Debuggers and profilers are tools that help you find correctness and performance bugs, respectively, in your code.
Traditional debuggers allow the programmer to instrument their code with "breakpoints" - places in the program where the program should stop so that the programmer can inspect the program's state.
Profilers typically instrument the program to report which instruction is being executed on some interval. The programmer can then look for parts of the program that are being executed more or less often than expected.
Tracing and monitoring is an important part of production engineering practice. By tracing the latency, monitoring the resource usage and collecting the error rate, engineers can know whether there are undetected software defects and whether the user experience is good.
Some common debuggers, profilers and tracing system are:
Interesting resources:
Project ideas: