]> git.ipfire.org Git - thirdparty/git.git/commitdiff
mingw: help debugging by optionally executing bash with strace
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Thu, 9 Apr 2020 10:21:47 +0000 (10:21 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 10 Apr 2020 17:21:07 +0000 (10:21 -0700)
MSYS2's strace facility is very useful for debugging... With this patch,
the bash will be executed through strace if the environment variable
GIT_STRACE_COMMANDS is set, which comes in real handy when investigating
issues in the test suite.

Also support passing a path to a log file via GIT_STRACE_COMMANDS to
force Git to call strace.exe with the `-o <path>` argument, i.e. to log
into a file rather than print the log directly.

That comes in handy when the output would otherwise misinterpreted by a
calling process as part of Git's output.

Note: the values "1", "yes" or "true" are *not* specifying paths, but
tell Git to let strace.exe log directly to the console.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
compat/mingw.c

index f2c94f9d0849c7fd19890e17df57adffa4ad6c83..178a70df61fd2417de7fc0aeb4b8019f27b9536f 100644 (file)
@@ -1488,6 +1488,7 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
        const char *(*quote_arg)(const char *arg) =
                is_msys2_sh(cmd ? cmd : *argv) ?
                quote_arg_msys2 : quote_arg_msvc;
+       const char *strace_env;
 
        /* Make sure to override previous errors, if any */
        errno = 0;
@@ -1571,6 +1572,31 @@ static pid_t mingw_spawnve_fd(const char *cmd, const char **argv, char **deltaen
                        free(quoted);
        }
 
+       strace_env = getenv("GIT_STRACE_COMMANDS");
+       if (strace_env) {
+               char *p = path_lookup("strace.exe", 1);
+               if (!p)
+                       return error("strace not found!");
+               if (xutftowcs_path(wcmd, p) < 0) {
+                       free(p);
+                       return -1;
+               }
+               free(p);
+               if (!strcmp("1", strace_env) ||
+                   !strcasecmp("yes", strace_env) ||
+                   !strcasecmp("true", strace_env))
+                       strbuf_insert(&args, 0, "strace ", 7);
+               else {
+                       const char *quoted = quote_arg(strace_env);
+                       struct strbuf buf = STRBUF_INIT;
+                       strbuf_addf(&buf, "strace -o %s ", quoted);
+                       if (quoted != strace_env)
+                               free((char *)quoted);
+                       strbuf_insert(&args, 0, buf.buf, buf.len);
+                       strbuf_release(&buf);
+               }
+       }
+
        ALLOC_ARRAY(wargs, st_add(st_mult(2, args.len), 1));
        xutftowcs(wargs, args.buf, 2 * args.len + 1);
        strbuf_release(&args);