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_print_key(&trace_foo, 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"); ------------