如何解决执行简单驱动程序的内核 insmod 时,仅创建伪 .gcda 文件和 .gcno 符号链接?如何获得正确的 *.gcda 文件?
我正在尝试为一个简单的 Linux 驱动程序获取 gcov 覆盖率。驱动程序代码非常基本,只有 init()
和 exit()
例程。
/*
** Module Init function
*/
static int __init hello_world_init(void)
{
printk(KERN_INFO "Welcome to AXeno Driver\n");
printk(KERN_INFO "This is the Simple Module\n");
printk(KERN_INFO "Kernel Module Inserted Successfully...\n");
return 0;
}
/*
** Module Exit function
*/
static void __exit hello_world_exit(void)
{
printk(KERN_INFO "Kernel Module Removed Successfully...\n");
}
module_init(hello_world_init);
module_exit(hello_world_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("AXeno");
MODULE_DESCRIPTION("A simple hello world driver");
MODULE_VERSION("2:1.0");
我正在交叉编译它以将它安装在 ARM 设备上。这是我的Makefile。
CROSS_COMPILER = aarch64-tizen-linux-gnu-
ARCH = arm64
TDIR = $(PWD)
KDIR = /home/axeno/Perforce/MAIN/ONEPROD_Prj/SOC/Soc/tester/kernel/linux-4.1.12
VDIR = /home/axeno/Perforce/MAIN/ONEPROD_Prj/SYSPLATFORM/Sysplatform/peri-drivers/vd_kernel-interfaces/include
ccflags-y += -Wall -fprofile-arcs -ftest-coverage -fPIC
GCOV_PROFILE := y
GCOV_PREFIX_testDriver.o := y
include $(KDIR)/.config
export KDIR ARCH CROSS_COMPILER TDIR CFLAGS LDFLAGS
obj-m += testDriver.o
all:
make -C $(KDIR) M=$(PWD) $(CFLAGS) modules CROSS_COMPILE="$(CROSS_COMPILER)"
现在当我构建它时,它正确地创建了 *.ko 和 *.gcno 文件。现在我将 *.ko 移动到我的目标,在 insmod
之前,我设置了
export GCOV_PREFIX="/mnt/gcda"
export GCOV_PREFIX_STRIP=15
将 *.gcda 文件写入我安装的闪存驱动器。我做了 insmod
,rmmod
从 dmesg 日志中一切正常。
我还使用以下设置编译了目标内核。
CONFIG_DEBUG_FS=y
CONFIG_GCOV_KERNEL=y
CONFIG_GCOV_FORMAT_AUTODETECT=y
CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=n
但是当我尝试查找 *.gcda 文件时,它默认为 /sys/kernel/debug/gcov 并在下面从我的主机形成整个路径结构.创建的 *.gcda 文件除了大约 10 个垃圾字符外没有任何信息。它还为 *.gcno 文件创建符号链接。因此它既不会重定向到 $GCOV_PREFIX 文件夹,也不会生成有意义的 *.gcda 文件。谁能帮我找出我遗漏了什么?
附言在同一个目标上,当我运行一个简单的应用程序而不是驱动程序时,它运行得非常好。它会在适当的目录中创建适当的 *.gcda 文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。