How to include C backtrace in a kernel module code?

后端 未结 4 1722
遥遥无期
遥遥无期 2021-02-01 04:13

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

4条回答
  •  抹茶落季
    2021-02-01 04:31

    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.

提交回复
热议问题