Как включить обратную трассировку C в код модуля ядра?

Итак, я пытаюсь выяснить, какие процессы ядра вызывают некоторые функции в драйвере блока. Я думал, что включение backtrace () в библиотеку C упростит задачу. Но у меня возникли проблемы с загрузкой трассировки.

Я скопировал этот пример функции, чтобы показать трассировку:

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

Все попытки скомпилировать иметь ошибку в том или ином месте, что файл не может быть найден или что функции не определены.

Вот что наиболее близко.

В Makefile я поместил директивы компилятора:

 -rdynamic -I/usr/include 

Если я оставлю вторую, -I / usr / include, компилятор сообщит, что не может найти требуемый заголовок execinfo.h.

Затем в код, в котором я хочу выполнить обратную трассировку. Я скопировал функцию из примера:

//trying to include the c backtrace capability
#include 

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

Я добавил вызов этой функции позже, в функции драйвера блока, где возникает первый признак ошибки. Просто:

show_stackframe();

Итак, когда я компилирую его, появляются следующие ошибки:

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!

Примечание: block26.c - это файл, из которого я надеюсь получить трассировку.

Есть ли очевидная причина, по которой backtrace и backtrace_symbols остаются неопределенными, когда они скомпилирован в модули .ko?

Я предполагаю это, потому что я использую компилятор include execinfo.h, который находится на компьютере и не загружается в модуль.

Это мое необразованное предположение, мягко говоря.

Может ли кто-нибудь предложить помощь в загрузке функций обратной трассировки в модуле?

Спасибо за просмотр этого запроса.

Я работаю над debian. Когда я беру функцию и тому подобное, модуль компилируется нормально и почти отлично работает.

От ndasusers

24
задан ndasusers 2 May 2011 в 22:21
поделиться