Библиотека сайта rus-linux.net
| Цилюрик О.И. Модули ядра Linux | ||
| Назад | Отладка в ядре | Вперед |
Тестирующий модуль
При организации модульного тестирования (unit testing) разработчик может столкнуться с недоумением, с тем как оформлять тесты, ведь создаваемый код модуля не может быть скомпилирован для работы в пользовательском режиме. Но в этом случае в коде проектируемого модуля могут быть созданы экспортируемые точки входа вида test_01(), test_02(), ... test_MN(), а для последовательного вызова тестовых входов создан отдельный тестирующий модуль, использующий показанный ранее трюк (разовое исполнение), весь код которого умещается в единственную функцию инициализации... Пример такой реализации упрощённой до предела показан в том же архиве simple-debug.tgz:
md1.h :
#include <linux/module.h> MODULE_LICENSE( "GPL" ); MODULE_AUTHOR( "Oleg Tsiliuric <olej@front.ru>" ); extern char* test_01( void ); extern char* test_02( void ); static int __init init( void ); module_init( init );
md1.c :
#include "md1.h"
static char retpref[] = "this string returned from ";
char* test_01( void ) {
static char res[ 80 ];
strcpy( res, retpref );
strcat( res, __FUNCTION__ );
return res;
};
EXPORT_SYMBOL( test_01 );
char* test_02( void ) {
static char res[ 80 ];
strcpy( res, retpref );
strcat( res, __FUNCTION__ );
return res;
};
EXPORT_SYMBOL( test_02 );
static int __init init( void ) {
return 0;
}
static void __exit exit( void ) {}
module_exit( exit );
А это — полный код тестирующего модуля, который мы пишем, как описывали выше, для однократного выполнения:
mt1.c :
#include "md1.h"
static int __init init( void ) {
printk( "%s\n", test_01() );
printk( "%s\n", test_02() );
return -1;
}
И вот как выглядит выполнение последовательности тестов проектируемого модуля:
$ sudo insmod md1.ko
$ sudo insmod mt1.ko
insmod: error inserting 'mt1.ko': -1 Operation not permitted
$ dmesg | tail -n2
this string returned fron test_01 this string returned fron test_02
| Предыдущий раздел: | Оглавление | Следующий раздел: |
| Отдельные отладочные приёмы и трюки | Интерфейсы пространства пользователя к модулю |
