As far as my testing goes, the message box is never shown on Windows when abort() is called with retail runtime is used, regardless of error mode and abort behaviour. That is not the case with _assert which still can show a dialog even in release mode.
It happens rather often that an app meets the error condition during the process exit and that goes silent on Windows while we display the abort dialog on app's exit.
The test program below shows that (and the same behaviour is, e. g., with ucrtbase vs ucrtbased).
``` #include <windows.h> #include <stdio.h> #include <stdlib.h>
void CDECL _set_app_type(int app_type);
#define D(name) static typeof(name) *p_##name #define L(name) p_##name = (void *)GetProcAddress(hdll, #name); if (!p_##name) printf("NULL %s.\n", #name)
D(abort); D(_set_app_type); D(_set_abort_behavior); D(_set_error_mode);
int main(int argc, char *argv[]) { HMODULE hdll = LoadLibraryA("msvcrt.dll"); printf("hdll %p.\n", hdll);
L(_set_app_type); if (!p__set_app_type) if (!(p__set_app_type = (void *)GetProcAddress(hdll, "__set_app_type"))) printf("NULL p__set_app_type.\n"); L(abort); L(_set_abort_behavior); L(_set_error_mode);
p__set_app_type(2); if (p__set_abort_behavior) p__set_abort_behavior(_WRITE_ABORT_MSG, _WRITE_ABORT_MSG); p__set_error_mode(_OUT_TO_MSGBOX); p_abort(); } ```
-- v3: msvcrt: Display message box in abort() for specific CRT versions only.
From: Paul Gofman pgofman@codeweavers.com
--- dlls/msvcrt/exit.c | 5 +++++ dlls/msvcrtd/Makefile.in | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/dlls/msvcrt/exit.c b/dlls/msvcrt/exit.c index 323d205b1bd..6427b15bece 100644 --- a/dlls/msvcrt/exit.c +++ b/dlls/msvcrt/exit.c @@ -51,7 +51,10 @@ static CRITICAL_SECTION MSVCRT_onexit_cs = { &MSVCRT_onexit_cs_debug, -1, 0, 0, extern int MSVCRT_app_type; extern wchar_t *MSVCRT__wpgmptr;
+#if _MSVCR_VER > 0 || defined(_DEBUG) static unsigned int MSVCRT_abort_behavior = _WRITE_ABORT_MSG | _CALL_REPORTFAULT; +#endif + static int MSVCRT_error_mode = _OUT_TO_DEFAULT;
void (*CDECL _aexit_rtn)(int) = _exit; @@ -250,6 +253,7 @@ void CDECL abort(void) { TRACE("()\n");
+#if (_MSVCR_VER > 0 && _MSVCR_VER < 100) || _MSVCR_VER == 120 || defined(_DEBUG) if (MSVCRT_abort_behavior & _WRITE_ABORT_MSG) { if ((MSVCRT_error_mode == _OUT_TO_MSGBOX) || @@ -260,6 +264,7 @@ void CDECL abort(void) else _cputs("\nabnormal program termination\n"); } +#endif raise(SIGABRT); /* in case raise() returns */ _exit(3); diff --git a/dlls/msvcrtd/Makefile.in b/dlls/msvcrtd/Makefile.in index bd4f78729d0..97743e99062 100644 --- a/dlls/msvcrtd/Makefile.in +++ b/dlls/msvcrtd/Makefile.in @@ -1,4 +1,4 @@ -EXTRADEFS = -D_CRTIMP= +EXTRADEFS = -D_CRTIMP= -D_DEBUG= MODULE = msvcrtd.dll IMPORTLIB = msvcrtd IMPORTS = ntdll
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=125253
Your paranoid android.
=== debian11 (build log) ===
Task: Could not create the win32 wineprefix: Failed to disable the crash dialogs: Task: WineTest did not produce the win32 report
v3: - Also hide the message box on msvcrt (and ifdef MSVCRT_abort_behavior to avoid the warning); - Define _DEBUG for msvcrtd and check that in message box condition.
This merge request was approved by Piotr Caban.