Fix a typo in an example in the trace API documentation. * ep/trace-doc-sample-fix: api-trace.txt: fix typo
		
			
				
	
	
		
			141 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
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
 | 
						|
------------
 |