From my experience it can be quite painful to workout why an application fails to install or uninstall. This is particularly the case when the custom actions are the point of failure.
The following page lists some approaches to debugging custom actions (see the “How do I debug a custom action/installer class?” section), however it took me fair amount of digging before I came across this nugget: running the msiexec from the command line allows you to turn on verbose logging of the install/uninstall process. For example, the following will produce a verbose log of the uninstall process:
msiexec /x {Product Code} /l*vx somefile.log
The log file is, obviously, very detailed, however it does at least allow you to check whether, for example, a custom action is being called or not.