调试技术(/proc、/sys、/dev、strace)
一、在/proc中实现文件
当某个进程读取我们的/proc文件时,内核会分配一个内存页,即PAGE_SIZE字节的内存块。
驱动程序可以将数据通过这个内存页返回到用户空间。
第一种方法,不采用seq_file
int write_proc(struct file *file, const char *buffer, size_t count, loff_t *ppos){
}
int read_proc(struct file *file, char *buffer, size_t count, loff_t *ppos){
}
static const struct file_operations proc_fops = {
.write = write_proc,
.read = read_proc
};
proc_create("name", 0660, NULL, >_upgrade_proc_fops);
第二种方法,采用seq_file
1.先实现seq_operations中的四个方法。
static const struct seq_operations my_seq_ops = {
.start = pfkey_seq_start,
.next = pfkey_seq_next,
.stop = pfkey_seq_stop,
.show = pfkey_seq_show,
};
2.构造一个file_operation结构
只要构造一个open函数即可,其他的均使用默认函数。
static int my_seq_open(struct inode *inode, struct file *file)
{
return seq_open(file, &my_seq_ops);
}
static const struct file_operations my_proc_ops = {
.open = my_seq_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
3.创建文件
proc_create("name", 0, null, &pfkey_proc_ops);
二、strace命令
strace命令是一个功能非常强大的工具,它可以显示由用户空间程序发出的所有系统调用。
它不仅可以显示调用,而且还能显示调用参数以及用符号形式表示的返回值。
命令行选项:
-t: 显示调用发生的时间;
-T: 显示调用所花费的时间;
-e: 限定被跟踪的调用类型;
-o: 将输出重定向到一个文件中。
strace可以跟踪一个正在运行的进程。
三、设备文件的创建
不要与在sysfs下创建访问节点相互混淆,这个仅仅是为了在/sys/class 目录下生成相应的文件,供uevent机制自动生成/dev下的设备文件;
后面会介绍创建sysfs下访问节点的方法。
static struct class *my_class;
struct device* temp;
my_class = class_create(THIS_MODULE, "class_name");
temp = device_create(my_class, misc->parent, dev, misc, "%s", misc->name); 根据创建的device就可以自动生成/dev目录下的设备文件 #define class_create(owner, name) { //仅仅是个宏而已
__class_create(owner, name, &__key);{
__class_register(cls, key);{
kset_register(&cp->subsys);{
kobject_add_internal(&k->kobj);{
create_dir(kobj);{
sysfs_create_dir(kobj);
populate_dir(kobj);{
sysfs_create_file(kobj, attr);
}
}
}
}
add_class_attrs(class_get(cls));{
class_create_file(cls, &cls->class_attrs[i]);{
sysfs_create_file(&cls->p->subsys.kobj, &attr->attr);
}
}
}
}
}
device_create(struct class *class, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...); //函数原型
修改自动创建的设备节点的权限、所有者和所属组:
修改system/core/rootdir/ueventd.rc文件即可,在其中加入将要创建的设备节点的相关属性。
例:
/dev/stpgps 0660 gps gps
四、/sys下创建属性文件的方法:
在已有的目录下创建属性文件:
/************************************************************/
该方法创建驱动的属性,一般存放在/sys/bus/platform/drivers/相应驱动/目录下面
int driver_create_file(struct device_driver *drv, const struct driver_attribute *attr);
sysfs_create_file(&drv->p->kobj, &attr->attr); /************************************************************/
该方法创建设备的属性,一般存放在/sys/devices/相应设备/目录下面。
int device_create_file(struct device *dev, const struct device_attribute *attr);
sysfs_create_file(&dev->kobj, &attr->attr);
在/sys/目录下创建新的目录,并创建默认的属性文件:
/************************************************************/
ssize_t mtk_uart_attr_show(struct kobject *kobj, struct attribute *attr, char *buffer)
{
struct mtuart_entry *entry = container_of(attr, struct mtuart_entry, attr);
return entry->show(kobj, buffer);
} ssize_t mtk_uart_attr_store(struct kobject *kobj, struct attribute *attr, const char *buffer, size_t size)
{
struct mtuart_entry *entry = container_of(attr, struct mtuart_entry, attr);
return entry->store(kobj, buffer, size);
} struct sysfs_ops mtk_uart_sysfs_ops = {
.show = mtk_uart_attr_show,
.store = mtk_uart_attr_store,
}; struct mtuart_entry {
struct attribute attr;
ssize_t (*show)(struct kobject *kobj, char *page);
ssize_t (*store)(struct kobject *kobj, const char *page, size_t size);
}; struct mtuart_entry conse_entry = {
{ .name = "conse", .mode = S_IRUGO | S_IWUSR },
mtk_uart_conse_show,
mtk_uart_conse_store,
}; .... struct attribute *mtk_uart_attributes[] = {
&conse_entry.attr, /*console setting*/
#if defined(ENABLE_DEBUG)
&debug_entry.attr,
&sysrq_entry.attr,
&vffsz_entry.attr,
&vff_en_entry.attr,
&lsr_status_entry.attr,
&history_entry.attr,
#endif
NULL,
}; struct kobj_type mtk_uart_ktype = {
.sysfs_ops = &mtk_uart_sysfs_ops,
.default_attrs = mtk_uart_attributes,
}; struct mtuart_sysobj {
struct kobject kobj;
atomic_t sysrq;
atomic_t vffLen[UART_NR*UART_VFIFO_NUM];
atomic_t console_enable;
} mtk_uart_sysobj = {
.console_enable = ATOMIC_INIT(1),
}; struct mtuart_sysobj *obj = &mtk_uart_sysobj;
obj->kobj.parent = kernel_kobj;
kobject_init_and_add(&obj->kobj, &mtk_uart_ktype, NULL, "mtuart");{
kobject_add_varg(kobj, parent, fmt, args);{
kobject_add_internal(kobj);{
create_dir(kobj);{
sysfs_create_dir(kobj);
populate_dir(kobj);{
sysfs_create_file(kobj, attr);
}
}
}
}
}
调试技术(/proc、/sys、/dev、strace)的更多相关文章
- linux内核调试技术之printk
原创博客:欢迎转载,转载请注明出处https://i.cnblogs.com/EditPosts.aspx?postid=6218383 1.简介(基于s3c2440 linux) 在内核调试技术之中 ...
- 掌握 Linux 调试技术
掌握 Linux 调试技术 在 Linux 上找出并解决程序错误的主要方法 Steve Best (sbest@us.ibm.com)JFS 核心小组成员,IBM 简介: 您可以用各种方法来监控运行着 ...
- Linux /proc、/dev Principle
目录 . /proc简介 . 内核机制相关 . 进程信息 . 硬件设备相关 . 系统信息 . /dev简介 . 内存相关 1. /proc简介 在linux的根目录下有一个/proc目录,/proc文 ...
- Linux驱动设计—— 驱动调试技术
参考博客与书籍: <Linux设备驱动开发详解> <Linux设备驱动程序> http://blog.chinaunix.net/uid-24219701-id-2884942 ...
- [转载]Android开发常用调试技术记录
ANDROID 调试技术: 1)Ps 指令 ls –l /proc/27/ cat /proc/27/cmdline #cmdline文件表示了这个进程所在的命令行. cat /proc/ ...
- Linux kprobe调试技术使用
kprobe调试技术是为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术. 利用kprobe技术,可以在内核绝大多数函数中动态插入探测点,收集调试状态所需信息而基本不影响原有执行流程. kpr ...
- Linux下的反调试技术
Linux下的反调试技术 2014年01月30日 ⁄ 综合 ⁄ 共 2669字 ⁄ 字号 小 中 大 ⁄ 评论关闭 转自 http://wangcong.org/blog/archives/310 ...
- IDA动态调试技术及Dump内存
IDA动态调试技术及Dump内存 来源 https://blog.csdn.net/u010019468/article/details/78491815 最近研究SO文件调试和dump内存时,为了完 ...
- linux中的调试知识---基础gdb和strace查看系统调用信息,top性能分析,ps进程查看,内存分析工具
1 调试一般分为两种,可以通过在程序中插入打印语句.有点能够显示程序的动态过程,比较容易的检查出源程序中的有关信息.缺点就是效率比较低了,而且需要输入大量无关的数据. 2 借助相关的调试工具. 3 有 ...
- /proc/sys/vm man手册
Manual page proc(5) line 1967 (press h for help or q to quit) /proc/sys/vm This directory contains f ...
随机推荐
- hdu 1998 奇数阶魔方(找规律+模拟)
应该不算太水吧. 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 ...
- tensorflow与kubernetes/docker结合使用实践
tensorflow tensorflow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流 ...
- Docker集群实验环境布署--swarm【3 注册服务监控与自动发现组件--consul】
参考官网集群配置方式 https://hub.docker.com/r/progrium/consul/ 集群中需要manager与node能通信consul的发现服务,不然,管理节点选举不了,无 ...
- Python wifi掉线重连接
原理很简单,通过python执行dos命令 : ping 和 netsh 需要用到os和time模块 代码如下: >>> import os >>> print ' ...
- windows下的畸形目录和文件的创建与删除
畸形目录的创建 md c:\a..\ 删除畸形目录 rd /s /q c:\a..\ 创建畸形文件 1 echo text> \\.\c:\aux..txt 读取畸形文件 type \\.\c: ...
- C++ 处理 utf-8
类似"abc汉字"这样的字符串是以utf-8编码; C++ 的 cout执行的操作是把参数发送给stdout,因此如果终端支持utf-8, 汉字可以使用cout打印: 比较好的办法 ...
- oc内容5大区
1.堆区(malloc):不需要手动管理内存,自动管理 2.栈区(stack):需要手动管理内存 3.静态区 4.常量区 5.方法区 load类方法:把类加载进内存的时候调用,只会调用一次 initi ...
- 修改/etc/resolv.conf又恢复到原来的状态?[转]
新装一台机器环境为服务器主板,双网卡,系统为CentOS5.4 ,eth0为内网ip,eth1为公网ip.但是由于在本地测试,设置的内网ip,域名服务器同样使用的是上海本地的域名解析,没有问题,可以上 ...
- CentOS 6.5 安装MySQL5.7 RPM
一.新特性 MySQL 5.7可谓是一个令人激动的里程碑,在默认了InnoDB引擎的基础上,新增了ssl.json.虚拟列等新特性.相对于postgreSQL和MariaDB而言,MySQL5.7做了 ...
- 敏捷开发(十)- Scrum每日例会
本文主要是为了检测你对SCRUM 评估会议的了解和使用程度, 通过本文你可以检测一下 1.你们的SCRUM 没人例会的过程和步骤 2.SCRUM 每日例会的输出结果一.会议目的 ...