[newlib-cygwin] Cygwin: Add --nokill dumper option
Jon TURNEY
jturney@sourceware.org
Fri Jul 31 13:01:31 GMT 2020
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=a5218ff7721bd5df023f576a0e9afb8f099c3b09
commit a5218ff7721bd5df023f576a0e9afb8f099c3b09
Author: Jon Turney <jon.turney@dronecode.org.uk>
Date: Mon Jul 6 14:51:32 2020 +0100
Cygwin: Add --nokill dumper option
Add --nokill option to dumper, for compatibility with minidumper, and to
assist with testing.
Diff:
---
winsup/doc/utils.xml | 10 +++++++---
winsup/utils/dumper.cc | 20 +++++++++++++++++++-
2 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/winsup/doc/utils.xml b/winsup/doc/utils.xml
index 8b92bfdf1..22bd86904 100644
--- a/winsup/doc/utils.xml
+++ b/winsup/doc/utils.xml
@@ -496,6 +496,7 @@ dumper [OPTION] FILENAME WIN32PID
<refsect1 id="dumper-options">
<title>Options</title>
<screen>
+-n, --nokill don't terminate the dumped process
-d, --verbose be verbose while dumping
-h, --help output help information and exit
-q, --quiet be quiet while dumping (default)
@@ -519,9 +520,12 @@ error_start=x:\path\to\dumper.exe
be started whenever some program encounters a fatal error. </para>
<para> <command>dumper</command> can be also be started from the command
- line to create a core dump of any running process. Unfortunately, because
- of a Windows API limitation, when a core dump is created and
- <command>dumper</command> exits, the target process is terminated too. </para>
+ line to create a core dump of any running process.</para>
+
+ <para>For historical reasons, unless the <literal>-n</literal> option
+ is given, after the core dump is created and when the
+ <command>dumper</command> exits, the target process is also
+ terminated.</para>
<para> To save space in the core dump, <command>dumper</command> doesn't
write those portions of the target process's memory space that are loaded
diff --git a/winsup/utils/dumper.cc b/winsup/utils/dumper.cc
index 36dbf9dbb..3eb4af275 100644
--- a/winsup/utils/dumper.cc
+++ b/winsup/utils/dumper.cc
@@ -64,6 +64,7 @@ __attribute__ ((packed))
note_header;
BOOL verbose = FALSE;
+BOOL nokill = FALSE;
int deb_printf (const char *format,...)
{
@@ -716,7 +717,19 @@ dumper::collect_process_information ()
current_event.dwThreadId,
DBG_CONTINUE);
}
+
failed:
+ if (nokill)
+ {
+ if (!DebugActiveProcessStop (pid))
+ {
+ fprintf (stderr, "Cannot detach from process #%u, error %ld",
+ (unsigned int) pid, (long) GetLastError ());
+ }
+ }
+ /* Otherwise, the debuggee is terminated when this process exits
+ (as DebugSetProcessKillOnExit() defaults to TRUE) */
+
/* set debugee free */
if (sync_with_debugee)
SetEvent (sync_with_debugee);
@@ -960,6 +973,7 @@ Usage: %s [OPTION] FILENAME WIN32PID\n\
\n\
Dump core from WIN32PID to FILENAME.core\n\
\n\
+ -n, --nokill don't terminate the dumped process\n\
-d, --verbose be verbose while dumping\n\
-h, --help output help information and exit\n\
-q, --quiet be quiet while dumping (default)\n\
@@ -969,13 +983,14 @@ Dump core from WIN32PID to FILENAME.core\n\
}
struct option longopts[] = {
+ {"nokill", no_argument, NULL, 'n'},
{"verbose", no_argument, NULL, 'd'},
{"help", no_argument, NULL, 'h'},
{"quiet", no_argument, NULL, 'q'},
{"version", no_argument, 0, 'V'},
{0, no_argument, NULL, 0}
};
-const char *opts = "dhqV";
+const char *opts = "ndhqV";
static void
print_version ()
@@ -1001,6 +1016,9 @@ main (int argc, char **argv)
while ((opt = getopt_long (argc, argv, opts, longopts, NULL) ) != EOF)
switch (opt)
{
+ case 'n':
+ nokill = TRUE;
+ break;
case 'd':
verbose = TRUE;
break;
More information about the Cygwin-cvs
mailing list