So I am trying to find out what kernel processes are calling some functions in a block driver. I thought including backtrace() in the C library would make it easy. But I am havi
If you need to save the stack trace and process its elements somehow, save_stack_trace()
or dump_trace()
might be also an option. These functions are declared in
and
, respectively.
It is not as easy to use these as dump_stack()
but if you need more flexibility, they may be helpful.
Here is how save_stack_trace()
can be used (replace HOW_MANY_ENTRIES_TO_STORE
with the value that suits your needs, 16-32 is usually more than enough):
unsigned long stack_entries[HOW_MANY_ENTRIES_TO_STORE];
struct stack_trace trace = {
.nr_entries = 0,
.entries = &stack_entries[0],
.max_entries = HOW_MANY_ENTRIES_TO_STORE,
/* How many "lower entries" to skip. */
.skip = 0
};
save_stack_trace(&trace);
Now stack_entries
array contains the appropriate call addresses. The number of elements filled is nr_entries
.
One more thing to point out. If it is desirable not to output the stack entries that belong to the implementation of save_stack_trace()
, dump_trace()
or dump_stack()
themselves (on different systems, the number of such entries may vary), the following trick can be applied if you use save_stack_trace()
. You can use __builtin_return_address(0)
as an "anchor" entry and process only the entries "not lower" than that.