Библиотека сайта 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
Предыдущий раздел: | Оглавление | Следующий раздел: |
Отдельные отладочные приёмы и трюки | Интерфейсы пространства пользователя к модулю |