processhelp.pm: log taskkill pid info, add debug envs, enable in CI
To debug the Windows CI fails further. Acting on the suspicions that
`taskkill` may sometimes be applied to the wrong process.
- log task info, and task child info before calling `taskkill` on a PID.
(on native Windows.)
One of the calls needs PowerShell.
- add env `CURL_TEST_NO_TASKKILL` to disable using `taskkill`.
- add env `CURL_TEST_NO_TASKKILL_TREE` to use `taskkill` without
`-t`, meaning to kill the process, but not child processes.
- GHA/windows: disable `taskkill` calls, to see what happens.
I'll revert or tweak this in a future commit depending on results.
Ref: https://github.com/curl/curl/discussions/14854#discussioncomment-13062859
Ref: https://github.com/curl/curl/discussions/14854#discussioncomment-14913014
Closes #19421
diff --git a/.github/scripts/typos.toml b/.github/scripts/typos.toml
index 28dcad7..3495823 100644
--- a/.github/scripts/typos.toml
+++ b/.github/scripts/typos.toml
@@ -4,7 +4,7 @@
[default]
extend-ignore-identifiers-re = [
- "^(ba|pn|PN|UE)$",
+ "^(ba|fo|pn|PN|UE)$",
"^(CNA|ser)$",
"^(ECT0|ECT1|HELO|htpt|PASE)$",
"^[A-Za-z0-9_-]*(EDE|GOST)[A-Z0-9_-]*$", # ciphers
diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml
index 8214cbb..bcb846d 100644
--- a/.github/workflows/windows.yml
+++ b/.github/workflows/windows.yml
@@ -37,6 +37,7 @@
env:
CURL_CI: github
+ CURL_TEST_NO_TASKKILL: '1'
jobs:
cygwin:
diff --git a/tests/processhelp.pm b/tests/processhelp.pm
index f1f8ef5..8c436d5 100644
--- a/tests/processhelp.pm
+++ b/tests/processhelp.pm
@@ -169,10 +169,29 @@
if($has_win32_process) {
Win32::Process::KillProcess($pid, 0);
} else {
- # https://ss64.com/nt/taskkill.html
- my $cmd = "taskkill -f -t -pid $pid >$dev_null 2>&1";
- print "Executing: '$cmd'\n";
- system($cmd);
+ # https://ss64.com/nt/tasklist.html
+ my $result = `tasklist -v -fo list -fi "PID eq $pid" 2>&1`;
+ $result =~ s/\r//g;
+ $result =~ s/\n/ | /g;
+ print "Task info for $pid before taskkill: '$result'\n";
+
+ $result = `powershell -Command "Get-CimInstance -ClassName Win32_Process -Filter 'ParentProcessId=$pid' | Select ProcessId,ParentProcessId,Name,CommandLine"`;
+ $result =~ s/\r//g;
+ print "Task child processes for $pid before taskkill:\n";
+ print "$result\n";
+
+ if(!$ENV{'CURL_TEST_NO_TASKKILL'}) {
+ # https://ss64.com/nt/taskkill.html
+ my $cmd;
+ if($ENV{'CURL_TEST_NO_TASKKILL_TREE'}) {
+ $cmd = "taskkill -f -pid $pid >$dev_null 2>&1";
+ }
+ else {
+ $cmd = "taskkill -f -t -pid $pid >$dev_null 2>&1";
+ }
+ print "Executing: '$cmd'\n";
+ system($cmd);
+ }
}
return;
}
@@ -198,10 +217,29 @@
if($has_win32_process) {
Win32::Process::KillProcess($pid, 0);
} else {
- # https://ss64.com/nt/taskkill.html
- my $cmd = "taskkill -f -t -pid $pid >$dev_null 2>&1";
- print "Executing: '$cmd'\n";
- system($cmd);
+ # https://ss64.com/nt/tasklist.html
+ my $result = `tasklist -v -fo list -fi "PID eq $pid" 2>&1`;
+ $result =~ s/\r//g;
+ $result =~ s/\n/ | /g;
+ print "Task info for $pid before taskkill: '$result'\n";
+
+ $result = `powershell -Command "Get-CimInstance -ClassName Win32_Process -Filter 'ParentProcessId=$pid' | Select ProcessId,ParentProcessId,Name,CommandLine"`;
+ $result =~ s/\r//g;
+ print "Task child processes for $pid before taskkill:\n";
+ print "$result\n";
+
+ if(!$ENV{'CURL_TEST_NO_TASKKILL'}) {
+ # https://ss64.com/nt/taskkill.html
+ my $cmd;
+ if($ENV{'CURL_TEST_NO_TASKKILL_TREE'}) {
+ $cmd = "taskkill -f -pid $pid >$dev_null 2>&1";
+ }
+ else {
+ $cmd = "taskkill -f -t -pid $pid >$dev_null 2>&1";
+ }
+ print "Executing: '$cmd'\n";
+ system($cmd);
+ }
}
return;
}