Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Can exchndl be made to catch RaiseFailFastException? #64

Closed
alvinhochun opened this issue Apr 10, 2022 · 4 comments
Closed

Can exchndl be made to catch RaiseFailFastException? #64

alvinhochun opened this issue Apr 10, 2022 · 4 comments

Comments

@alvinhochun
Copy link
Contributor

alvinhochun commented Apr 10, 2022

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
Copy link
Owner

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
Copy link
Contributor Author

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
Copy link
Owner

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
Copy link
Owner

No further action planned from DrMinGW side, so closing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants