|  | trace API | 
|  | ========= | 
|  |  | 
|  | The trace API can be used to print debug messages to stderr or a file. Trace | 
|  | code is inactive unless explicitly enabled by setting `GIT_TRACE*` environment | 
|  | variables. | 
|  |  | 
|  | The trace implementation automatically adds `timestamp file:line ... \n` to | 
|  | all trace messages. E.g.: | 
|  |  | 
|  | ------------ | 
|  | 23:59:59.123456 git.c:312 trace: built-in: git 'foo' | 
|  | 00:00:00.000001 builtin/foo.c:99 foo: some message | 
|  | ------------ | 
|  |  | 
|  | Data Structures | 
|  | --------------- | 
|  |  | 
|  | `struct trace_key`:: | 
|  |  | 
|  | Defines a trace key (or category). The default (for API functions that | 
|  | don't take a key) is `GIT_TRACE`. | 
|  | + | 
|  | E.g. to define a trace key controlled by environment variable `GIT_TRACE_FOO`: | 
|  | + | 
|  | ------------ | 
|  | static struct trace_key trace_foo = TRACE_KEY_INIT(FOO); | 
|  |  | 
|  | static void trace_print_foo(const char *message) | 
|  | { | 
|  | trace_printf_key(&trace_foo, "%s", message); | 
|  | } | 
|  | ------------ | 
|  | + | 
|  | Note: don't use `const` as the trace implementation stores internal state in | 
|  | the `trace_key` structure. | 
|  |  | 
|  | Functions | 
|  | --------- | 
|  |  | 
|  | `int trace_want(struct trace_key *key)`:: | 
|  |  | 
|  | Checks whether the trace key is enabled. Used to prevent expensive | 
|  | string formatting before calling one of the printing APIs. | 
|  |  | 
|  | `void trace_disable(struct trace_key *key)`:: | 
|  |  | 
|  | Disables tracing for the specified key, even if the environment | 
|  | variable was set. | 
|  |  | 
|  | `void trace_printf(const char *format, ...)`:: | 
|  | `void trace_printf_key(struct trace_key *key, const char *format, ...)`:: | 
|  |  | 
|  | Prints a formatted message, similar to printf. | 
|  |  | 
|  | `void trace_argv_printf(const char **argv, const char *format, ...)``:: | 
|  |  | 
|  | Prints a formatted message, followed by a quoted list of arguments. | 
|  |  | 
|  | `void trace_strbuf(struct trace_key *key, const struct strbuf *data)`:: | 
|  |  | 
|  | Prints the strbuf, without additional formatting (i.e. doesn't | 
|  | choke on `%` or even `\0`). | 
|  |  | 
|  | `uint64_t getnanotime(void)`:: | 
|  |  | 
|  | Returns nanoseconds since the epoch (01/01/1970), typically used | 
|  | for performance measurements. | 
|  | + | 
|  | Currently there are high precision timer implementations for Linux (using | 
|  | `clock_gettime(CLOCK_MONOTONIC)`) and Windows (`QueryPerformanceCounter`). | 
|  | Other platforms use `gettimeofday` as time source. | 
|  |  | 
|  | `void trace_performance(uint64_t nanos, const char *format, ...)`:: | 
|  | `void trace_performance_since(uint64_t start, const char *format, ...)`:: | 
|  |  | 
|  | Prints the elapsed time (in nanoseconds), or elapsed time since | 
|  | `start`, followed by a formatted message. Enabled via environment | 
|  | variable `GIT_TRACE_PERFORMANCE`. Used for manual profiling, e.g.: | 
|  | + | 
|  | ------------ | 
|  | uint64_t start = getnanotime(); | 
|  | /* code section to measure */ | 
|  | trace_performance_since(start, "foobar"); | 
|  | ------------ | 
|  | + | 
|  | ------------ | 
|  | uint64_t t = 0; | 
|  | for (;;) { | 
|  | /* ignore */ | 
|  | t -= getnanotime(); | 
|  | /* code section to measure */ | 
|  | t += getnanotime(); | 
|  | /* ignore */ | 
|  | } | 
|  | trace_performance(t, "frotz"); | 
|  | ------------ | 
|  |  | 
|  | Bugs & Caveats | 
|  | -------------- | 
|  |  | 
|  | GIT_TRACE_* environment variables can be used to tell Git to show | 
|  | trace output to its standard error stream. Git can often spawn a pager | 
|  | internally to run its subcommand and send its standard output and | 
|  | standard error to it. | 
|  |  | 
|  | Because GIT_TRACE_PERFORMANCE trace is generated only at the very end | 
|  | of the program with atexit(), which happens after the pager exits, it | 
|  | would not work well if you send its log to the standard error output | 
|  | and let Git spawn the pager at the same time. | 
|  |  | 
|  | As a work around, you can for example use '--no-pager', or set | 
|  | GIT_TRACE_PERFORMANCE to another file descriptor which is redirected | 
|  | to stderr, or set GIT_TRACE_PERFORMANCE to a file specified by its | 
|  | absolute path. | 
|  |  | 
|  | For example instead of the following command which by default may not | 
|  | print any performance information: | 
|  |  | 
|  | ------------ | 
|  | GIT_TRACE_PERFORMANCE=2 git log -1 | 
|  | ------------ | 
|  |  | 
|  | you may want to use: | 
|  |  | 
|  | ------------ | 
|  | GIT_TRACE_PERFORMANCE=2 git --no-pager log -1 | 
|  | ------------ | 
|  |  | 
|  | or: | 
|  |  | 
|  | ------------ | 
|  | GIT_TRACE_PERFORMANCE=3 3>&2 git log -1 | 
|  | ------------ | 
|  |  | 
|  | or: | 
|  |  | 
|  | ------------ | 
|  | GIT_TRACE_PERFORMANCE=/path/to/log/file git log -1 | 
|  | ------------ |