This talk presents generic techniques, which can be used to investigate problems in software — regardless of the technology. This will involve principles such as: isolation, reverse engineering and validating assumptions. The usage of these techniques will be presented based on real-life cases. For each case we will formulate a plan of debugging the issue and also choose tools that will be a good match for aiding in the debugging process. One more point that I would like to emphasize would be the suggestion to not be afraid to look under the hood when investigating the issue (looking into the code of the external libraries, checking system calls and signals etc.).