From: Jon Turney <jon.turney@dronecode.org.uk>
Cc: cygwin-patches@cygwin.com
Subject: Re: [PATCH 1/5] Cygwin: Make 'ulimit -c' control writing a coredump
Date: Tue, 23 Jan 2024 14:20:27 +0000 [thread overview]
Message-ID: <238901bf-db88-4d99-bb82-2b98ff6ebdf6@dronecode.org.uk> (raw)
In-Reply-To: <20240112140958.1694-2-jon.turney@dronecode.org.uk>
[-- Attachment #1: Type: text/plain, Size: 1327 bytes --]
On 12/01/2024 14:09, Jon Turney wrote:
> Pre-format a command to be executed on a fatal error to run 'dumper'
> (using an absolute path).
>
> Factor out executing a pre-formatted command, so we can use that for
> invoking the JIT debugger in try_to_debug() (if error_start is present
> in the CYGWIN env var) and to invoke dumper when a fatal error occurs.
>
So, there is a small problem with this change: because dumper itself
terminates the dumped process, it doesn't go on to exit with the
signal+128 exit status.
(In fact, it seems to exit with status 0 when terminated by an attached
debugger terminating, which isn't great)
That's relatively easy to fix: just use the '-n' option to dumper so it
detaches before exiting, to prevent that terminating the dumped process,
but then we run into the difficulties of reliably detecting that dumper
has attached and done it's work, so it's safe for us to exit.
Attached patch does that, and documents the expectations on the
error_start command a bit more clearly.
Even then this is clearly not totally bullet-proof. Maybe the right
thing to do is add a suitable timeout here, so even if we fail to notice
the DebugActiveProcess() (or there's a custom JIT debugger which just
writes the fact a process crashed to a logfile or something), we'll exit
eventually?
[-- Attachment #2: 0001-Cygwin-Don-t-terminate-via-dumper.patch --]
[-- Type: text/plain, Size: 2715 bytes --]
From 85120a1697294cd93ff68f6b1840145251ce4185 Mon Sep 17 00:00:00 2001
From: Jon Turney <jon.turney@dronecode.org.uk>
Date: Tue, 16 Jan 2024 16:12:51 +0000
Subject: [PATCH] Cygwin: Don't terminate via dumper
A process which is exiting due to a core dumping signal doesn't
propagate the correct exist status after dumping core, because 'dumper'
itself forcibly terminates the process.
Use 'dumper -n' to avoid killing the dumped process, so we continue to
the end of signal_exit() , to exit with the 128+signal exit status.
Busy-wait in exec_prepared_command() in an attempt to reliably notice
the dumper attaching, so we don't get stuck there.
Also: document these important facts for custom uses of error_start.
---
winsup/cygwin/exceptions.cc | 7 +++----
winsup/doc/cygwinenv.xml | 6 ++++++
2 files changed, 9 insertions(+), 4 deletions(-)
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 8b1c5493e..0e1a804ca 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -149,7 +149,7 @@ dumper_init (void)
/* Calculate the length of the command, allowing for an appended DWORD PID and
terminating null */
- int cmd_len = 1 + wcslen(dll_dir) + 11 + 2 + 1 + wcslen(global_progname) + 1 + 10 + 1;
+ int cmd_len = 1 + wcslen(dll_dir) + 11 + 5 + 1 + wcslen(global_progname) + 1 + 10 + 1;
if (cmd_len > 32767)
{
/* If this comes to more than the 32,767 characters CreateProcess() can
@@ -163,7 +163,7 @@ dumper_init (void)
cp = wcpcpy (cp, L"\"");
cp = wcpcpy (cp, dll_dir);
cp = wcpcpy (cp, L"\\dumper.exe");
- cp = wcpcpy (cp, L"\" ");
+ cp = wcpcpy (cp, L"\" -n ");
cp = wcpcpy (cp, L"\"");
cp = wcpcpy (cp, global_progname);
wcscat (cp, L"\"");
@@ -570,9 +570,8 @@ int exec_prepared_command (PWCHAR command)
system_printf ("Failed to start, %E");
else
{
- SetThreadPriority (GetCurrentThread (), THREAD_PRIORITY_IDLE);
while (!being_debugged ())
- Sleep (1);
+ Sleep (0);
Sleep (2000);
}
diff --git a/winsup/doc/cygwinenv.xml b/winsup/doc/cygwinenv.xml
index d97f2b77d..05672c404 100644
--- a/winsup/doc/cygwinenv.xml
+++ b/winsup/doc/cygwinenv.xml
@@ -46,6 +46,12 @@ to the command as arguments.
Note: This has no effect if a debugger is already attached when the fatal
error occurs.
</para>
+<para>
+ Note: The command invoked must either (i) attach to the errored process with
+ <function>DebugActiveProcess()</function>, or (ii) forcibly terminate the
+ errored process (with <function>TerminateProcess()</function> or similar), as
+ otherwise the errored process will wait forever for a debugger to attach.
+</para>
</listitem>
<listitem>
--
2.43.0
next prev parent reply other threads:[~2024-01-23 14:20 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-12 14:09 [PATCH 0/5] Coredump under 'ulimit -c' control (v2) Jon Turney
2024-01-12 14:09 ` [PATCH 1/5] Cygwin: Make 'ulimit -c' control writing a coredump Jon Turney
2024-01-13 14:20 ` Jon Turney
2024-01-15 9:46 ` Corinna Vinschen
2024-01-15 13:27 ` Jon Turney
2024-01-15 14:28 ` Corinna Vinschen
2024-01-16 13:52 ` Jon Turney
2024-01-16 13:54 ` Corinna Vinschen
2024-01-23 14:20 ` Jon Turney [this message]
2024-01-23 14:29 ` Corinna Vinschen
2024-01-24 13:28 ` Jon Turney
2024-01-24 14:39 ` Corinna Vinschen
2024-01-25 14:50 ` Jon Turney
2024-01-25 18:21 ` Corinna Vinschen
2024-01-25 20:03 ` Jon Turney
2024-01-26 11:12 ` Corinna Vinschen
2024-01-26 11:52 ` Corinna Vinschen
2024-01-27 15:12 ` Jon Turney
2024-01-29 11:16 ` Corinna Vinschen
2024-01-12 14:09 ` [PATCH 2/5] Cygwin: Disable writing core dumps by default Jon Turney
2024-01-12 14:09 ` [PATCH 3/5] Cygwin: Define and use __WCOREFLAG Jon Turney
2024-01-12 14:09 ` [PATCH 4/5] Cygwin: Treat api_fatal() similarly to a core-dumping signal Jon Turney
2024-01-12 14:09 ` [PATCH 5/5] Cygwin: Update documentation for cygwin_stackdump Jon Turney
2024-01-12 18:44 ` Corinna Vinschen
2024-01-13 13:40 ` Jon Turney
2024-01-12 18:41 ` [PATCH 0/5] Coredump under 'ulimit -c' control (v2) Corinna Vinschen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=238901bf-db88-4d99-bb82-2b98ff6ebdf6@dronecode.org.uk \
--to=jon.turney@dronecode.org.uk \
--cc=cygwin-patches@cygwin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).