Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to include C backtrace in a kernel module code?

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 having trouble to load the backtrace.

I copied this example function to show the backtrace:

http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/063/6391/6391l1.html

All attempts to compile have error in one place or another that a file cannot be found or that the functions are not defined.

Here is what comes closest.

In the Makefile I put the compiler directives:

 -rdynamic -I/usr/include  

If I leave out the second one, -I/usr/include, then the compiler reports it cannot find the required header execinfo.h.

Next, in the code where I want to do the backtrace I have copied the function from the example:

//trying to include the c backtrace capability #include <execinfo.h>  void show_stackframe() { void *trace[16]; char **messages = (char **)NULL; int i, trace_size = 0;  trace_size = backtrace(trace, 16); messages = backtrace_symbols(trace, trace_size); printk(KERN_ERR "[bt] Execution path:\n"); for (i=0; i<trace_size; ++i)     printk(KERN_ERR "[bt] %s\n", messages[i]); } //backtrace function 

I have put the call to this function later on, in a block driver function where the first sign of the error happens. Simply:

show_stackframe(); 

So when I compile it, the following errors:

user@slinux:~/2.6-32$ make -s Invoking make againt the kernel at /lib/modules/2.6.32-5-686/build In file included from /usr/include/features.h:346,         from /usr/include/execinfo.h:22,         from /home/linux/2.6-32/block/block26.c:49: /usr/include/sys/cdefs.h:287:1: warning: "__always_inline" redefined In file included from /usr/src/linux-headers-2.6.32-5-common/include/linux/compiler-gcc.h:86,         from /usr/src/linux-headers-2.6.32-5-common/include/linux/compiler.h:40,         from /usr/src/linux-headers-2.6.32-5-common/include/linux/stddef.h:4,         from /usr/src/linux-headers-2.6.32-5-common/include/linux/list.h:4,         from /usr/src/linux-headers-2.6.32-5-common/include/linux/module.h:9,         from /home/linux/2.6-32/inc/linux_ver.h:40,         from /home/linux/2.6-32/block/block26.c:32: /usr/src/linux-headers-2.6.32-5-common/include/linux/compiler-gcc4.h:15:1: warning: this is the location of the previous definition     /home/linux/2.6-32/block/block26.c:50: warning: function declaration isn’t a prototype WARNING: "backtrace" [/home/linux/2.6-32/ndas_block.ko] undefined! WARNING: "backtrace_symbols" [/home/linux/2.6-32/ndas_block.ko] undefined! 

Note: block26.c is the file I am hoping to get the backtrace from.

Is there an obvious reason why the backtrace and backtrace_symbols remain undefined when it is compiled into the .ko modules?

I am guessing it because I use the compiler include execinfo.h which is residing on the computer and not being loaded to the module.

It is my uneducated guess to say the least.

Can anyone offer a help to get the backtrace functions loading up in the module?

Thanks for looking at this inquiry.

I am working on debian. When I take out the function and such, the module compiles fine and almost works perfectly.

From ndasusers

like image 267
ndasusers Avatar asked May 02 '11 22:05

ndasusers


People also ask

How to print backtrace in linux kernel?

One of the useful options in debugging is to print the call trace/stack trace. Linux kernel provides a function to print the stack trace: dump_stack(). Calling dump_stack() function will print the stack trace at that point.

How to print stack trace in linux kernel?

Linux kernel provides a function to print the stack trace: dump_stack(). The dump_stack function produces a stack trace much like panic and oops, but causes no problems and we return to the normal control flow. Calling dump_stack() function will print the stack trace at that point.

What is dump_stack in Linux?

Dump_stack() in Linux Kernel is used to output call stack information when there is a kernel crash/panic but we can also use it for debugging/tracing.

Which command is used to compile a kernel module?

Use the make command to compile hello world kernel module as shown below.


1 Answers

To print the stack contents and a backtrace to the kernel log, use the dump_stack() function in your kernel module. It's declared in linux/kernel.h in the include folder in the kernel source directory.

like image 78
jmkeyes Avatar answered Sep 22 '22 02:09

jmkeyes