Question
Is there any way to dump the call stack in a running process in C or C++ every time a certain function is called? What I have in mind is something like this:
void foo()
{
print_stack_trace();
// foo's body
return
}
Where print_stack_trace
works similarly to
caller
in Perl.
Or something like this:
int main (void)
{
// will print out debug info every time foo() is called
register_stack_trace_function(foo);
// etc...
}
where register_stack_trace_function
puts some sort of internal breakpoint
that will cause a stack trace to be printed whenever foo
is called.
Does anything like this exist in some standard C library?
I am working on Linux, using GCC.
Background
I have a test run that behaves differently based on some commandline switches that shouldn't affect this behavior. My code has a pseudo-random number generator that I assume is being called differently based on these switches. I want to be able to run the test with each set of switches and see if the random number generator is called differently for each one.
Answer
For a linux-only solution you can use
[backtrace(3)](http://www.kernel.org/doc/man-
pages/online/pages/man3/backtrace.3.html) that simply returns an array of
void *
(in fact each of these point to the return address from the
corresponding stack frame). To translate these to something of use, there's
backtrace_symbols(3).
Pay attention to the [notes section in backtrace(3)](http://www.kernel.org/doc/man- pages/online/pages/man3/backtrace.3.html#NOTES):
The symbol names may be unavailable without the use of special linker options. For systems using the GNU linker, it is necessary to use the -rdynamic linker option. Note that names of "static" functions are not exposed, and won't be available in the backtrace.