For Windows apps, there are the utilities regmon, filemon, and process explorer.
When a programs fails, these tools help to show you what file/registry entry/process was in-play at the time. You can spot things like multiple versions of DLLs, missing registry entries or other failures with these tools.
http://technet.microsoft.com/en-us/sysinternals/default.aspx
On a more advanced level, you can run programs in a debugger, decompile them, reverse engineer them, and even edit them. I won't go into all the tools here, but a debugger is a really fun utility to play with, and very educational. The neat thing about a debugger is you can halt the program the instant it fails, which can be very useful in doing troublehsooting.
http://www.heaventools.com/PE_Explorer_disassembler.htm
IDA Pro is very cool:
http://www.hex-rays.com/idapro/
I've never used these but:
http://www.microsoft.com/whdc/devtools/debugging/installx86.Mspx
If the program uses the network a lot, then you need to get familiar with the protocols and methods it uses. My favorite tool for this is WireShark, which is a packet sniffer / protocol analyzer application. With this type of tool you can view the packets that make up the conversation between the client and the server and determine what is going wrong.
www.wireshark.org
From a training perspective, I don't know what to suggest. It's a gray area between basic computer training (A+, MCSE) and hyper-technical programmer training (MCSD, Oracle Certification, etc).
The best traning, in a way, is to train to be a programmer. The irony is that you would not have to fix so much in the field if the programmers of the app you support did a better job.