debugfs를 사용하여 디버그 정보 내보내기 - 간단한 예
Documentation/filesystems/debugfs.txt
이 모듈은 디버그 정보를 사용자 공간에 내보내기 위해 debugfs를 사용하는 방법을 보여 줍니다.
이 모듈은 debugfs 루트에 다음과 같은 파일을 생성합니다.
dbgfs_demon/
├── data
└── tracing_on
작업 논리는tracingon의 값은 Y입니다. 데이터에서 유용한 디버깅 정보를 읽을 수 있습니다.
N이면 데이터 읽기 작업은 데이터를 반환하지 않습니다.
다음은 구체적인 실현 코드다.
컴파일 및 사용:
#echo "obj-m:= dbgfs.o"> Makefile
#make -C/path/to/kernel/tree M=`pwd` modules
#insmod dbgfs.ko
마운트 해제 모듈
#rmmod dbgfs
debugfs 마운트
#mkdir/mnt/debug
#mount -t debugfs nodev/mnt/debug
#cd/mnt/debug/dbgfs_demon
...
// dbgfs.c
/*
* (C) 05-07-2012 Yang Honggang (Joseph), Dslab <[email protected]>
*/
#include <linux/debugfs.h>
#include <linux/module.h>
#include <linux/mm.h>
#include <asm/uaccess.h>
struct dentry *parent, *sw, *inf;
u32 tr_on = 0;
struct my_data_struct {
void* data;
unsigned long size;
} mds;
struct page* pg;
static ssize_t data_read(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos)
{
unsigned long i;
size_t cnt;
printk("tr_on:%d
", tr_on);
/* If the tracing_on is Y, fill the data buffer with debug info */
if (tr_on) {
tr_on = 0; /* Automaticlly clear the 'tracing_on' flag */
for (i = 0; i < (mds.size - 11) / 11; i ++) {
sprintf((char*)((char*)mds.data + i * 11 ), "%ld
", i + 1000000000);
}
/* Copy debug info to userspace */
cnt = copy_to_user(user_buf, (const void *)mds.data, mds.size);
return (mds.size - cnt);
}
return 0;
}
const struct file_operations fops =
{
.read = data_read,
};
static int __init dbgfs_demon_init(void)
{
printk("dbgfs init
");
/* Create dbgfs_demon directory in the debugfs root */
parent = debugfs_create_dir("dbgfs_demon", NULL);
if (!parent)
return -1;
/* Create a output switch in dbgfs_demon */
sw = debugfs_create_bool("tracing_on", S_IRWXU,
parent, &tr_on);
if (!sw)
goto p_out;
/* Create a file for debug information exporting */
mds.size = 4 * 1024;
/* Allocate one page for info. storing */
pg = alloc_pages(__GFP_HIGHMEM | __GFP_ZERO, 0);
/* Covert to Memory address */
mds.data = (void*) page_address(pg);
if (!pg)
goto p_out;
inf = debugfs_create_file("data", S_IRUSR,
parent, &mds, &fops);
if (!inf)
goto sw_out;
return 0;
sw_out:
debugfs_remove(sw);
__free_pages(pg, 0);
p_out:
debugfs_remove(parent);
return -1;
}
static void __exit dbgfs_demon_exit(void)
{
if (pg)
__free_pages(pg, 0);
debugfs_remove(inf);
debugfs_remove(sw);
debugfs_remove(parent);
printk("dbgfs exit
");
return;
}
module_init(dbgfs_demon_init);
module_exit(dbgfs_demon_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Yang Honggang (Joseph) <[email protected]>");
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Ruby의 구조체 클래스은 접근자 메서드가 있는 속성 모음입니다. 클래스를 명시적으로 작성할 필요 없이. Struct 클래스는 구성원 및 해당 값 집합을 포함하는 새 하위 클래스를 생성합니다. 각 멤버에 대해 #attr_accessor 와...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.