jrfonseca / drmingw

Postmortem debugging tools for MinGW.
GNU Lesser General Public License v2.1
273 stars 53 forks source link

Can exchndl be made to catch RaiseFailFastException? #64

Closed alvinhochun closed 2 years ago

alvinhochun commented 2 years ago

Qt decided that its fatal error handler should call RaiseFailFastException instead of just abort (context). This issue also touches on the exceptional behaviour of abort which Qt is trying to prevent.

However, exchndl is apparently unable to dump the stack trace when the Qt fatal error handler is called. Are there any tricks to make exchndl work for this case?

jrfonseca commented 2 years ago

RaiseFailFastException specifically skips any exception handlers. So I see the following options (from simplest to hardest):

  1. The ideal would be for Qt to provide a callback from qt_message_fatal, where one could just raise a normal exception which would be trapped by ExcHndl.
  2. Catch exception out of process, through the debugging API. That is, use DrMinGW's catchsegv instead of ExcHndl. There might be some performance impact, particularly initialization (when loading all DLLs.) Give it a try running Krita inside (catchsegv -m krita ...) -- if performance is acceptable, then you could have setup krita to always be run inside catchsegv (via the shortcuts, or through a launcher.)
  3. Use Detours inside ExcHndl to intercept RaiseFailFastException and report the exception. In one way, this is less disruptive, but potentially more brittle, as these code patching mechanisms are the same used by malware, hence are constantly getting constrained.

I hope this helps.

alvinhochun commented 2 years ago

Thanks for the suggestions. Given these options I think I will patch Qt's behaviour for now and consider moving to a catchsegv-like approach in the future. I've always wanted to implement a better UI on crash, so maybe I will try to make a fancier GUI version of it (not now though 😆 ). I tried catchsegv on Krita and didn't see any slowdown on initialization... but frankly Krita on Windows already starts up way slower than on Linux (10 seconds vs 3 seconds).

Side note: When I tested with catchsegv, it didn't seem to be able to produce line number info (exchndl outputs them fine). I have split debug file linked with gnu-debuglink, maybe that is broken with catchsegv?

jrfonseca commented 2 years ago

When I tested with catchsegv, it didn't seem to be able to produce line number info (exchndl outputs them fine). I have split debug file linked with gnu-debuglink, maybe that is broken with catchsegv?

It should work.

jrfonseca commented 2 years ago

No further action planned from DrMinGW side, so closing.