| 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 | |
| ------------ |