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.
This commit is contained in:
parent
752489c76e
commit
15140d6df6
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue