linux内核 print,自定义linux内核调试print
调试信息过多造成dmesg无法完全显示怎么办?
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#if defined(MODVERSIONS) && !defined(__GENKSYMS__)
#include
#endif
#ifdef DBGPRT_OUTVER
#include "dbgprint.ver" /* redefine "dbgprint" to include CRC */
#endif
#ifndef EXPORT_SYMTAB
#define EXPORT_SYMTAB
#endif
#include
#include
#include
#include
#include
//#include
#include
#include
#include "dbgprint.h"
EXPORT_SYMBOL(DbgPrint);
#ifndef DBGPRT_VER
#define DBGPRT_VER "0.90"
#endif
int dbgprt_major=65; //the major device number
char dbgprt_dev_name[]={"ALIDbg"}; //the name in /dev
char dbgprt_ver[]={DBGPRT_VER};
//module paramaters and infos
MODULE_AUTHOR("ALI_SHA");
MODULE_DESCRIPTION("Ali M3321 DEBUGER PRINT.");
MODULE_PARM(dbgprt_ver,"s");
MODULE_PARM_DESC(dbgprt_ver,DBGPRT_VER);
MODULE_PARM(dbgprt_major,"i");
MODULE_PARM_DESC(dbgprt_major,"65");
MODULE_PARM(dbgprt_dev_name,"s");
MODULE_PARM_DESC(dbgprt_dev_name,"ALIDbg");
wait_queue_head_t pSleep;
//used to manager the buffer
char chrgMessage[4096]; //the last 1024 don't use for overflow
char* pchEnd;
char* pchStart;
char fTurn; //pchEnd littl than pchStart
char* pchMessageEnd; //the end pointer of array
int nOverLen;
struct file_operations ALIDbgOps =
{
THIS_MODULE,
NULL,
DbgRead,
NULL, //ali_write,
NULL,
NULL,
DbgIoCtl,
NULL,
DbgOpen,
NULL,
DbgClose,
NULL,
NULL,
NULL,
NULL,
NULL
};
int init_module(void)
{
int nResult;
nResult = register_chrdev(dbgprt_major,dbgprt_dev_name,&ALIDbgOps);
if(nResult<0)
{
printk("can't register this device!\n");
return -1;
}
pchStart=chrgMessage;
pchEnd=chrgMessage;
pchMessageEnd=chrgMessage+3072;
fTurn=0;
init_waitqueue_head(&pSleep);
return 0;
}
int cleanup_module()
{
unregister_chrdev(dbgprt_major,dbgprt_dev_name);
return 0;
}
int DbgOpen(struct inode* i,struct file *f)
{
MOD_INC_USE_COUNT;
return 0;
}
int DbgClose(struct inode* i,struct file *f)
{
wake_up_interruptible(&pSleep);
MOD_DEC_USE_COUNT;
return 0;
}
ssize_t DbgRead (struct file* fileDbg, char* pchMsg, size_t nLen, loff_t* pOff)
{
int nMsgLen;
if(!fTurn && (pchStart==pchEnd) )
{
interruptible_sleep_on(&pSleep);
}
if(!fTurn)
{
nMsgLen=pchEnd-pchStart;
if(nLen {
copy_to_user(pchMsg,pchStart,nLen);
pchStart+=nLen;
return nLen;
}
copy_to_user(pchMsg,pchStart,nMsgLen);
}
else
{
if(nLen {
copy_to_user(pchMsg,pchStart,nLen);
pchStart+=nLen;
return nLen;
}
copy_to_user(pchMsg,pchStart,nOverLen);
fTurn=0;
nMsgLen=pchEnd-chrgMessage;
if( (nLen-nOverLen) {
copy_to_user(pchMsg+nOverLen,chrgMessage,nLen-nOverLen);
pchStart=chrgMessage+nLen-nOverLen;
return nLen;
}
copy_to_user(pchMsg+nOverLen,chrgMessage,nMsgLen);
nMsgLen+=nOverLen;
}
pchStart=chrgMessage;
pchEnd=chrgMessage;
return nMsgLen;
}
int DbgIoCtl(struct inode* i,struct file *f,unsigned int cmd,unsigned long arg)
{
switch(cmd)
{
case DBGPRT_IO_CANCLE:
wake_up_interruptible(&pSleep);
break;
default:
return -1;
}
return 0;
}
int DbgPrint(const char *fmt, ...)
{
va_list args;
int nMessageLen;
va_start(args, fmt);
nMessageLen=vsprintf(pchEnd,fmt,args);
va_end(args);
pchEnd+=nMessageLen;
if(pchEnd>=pchMessageEnd)
//the message overflowed
{
nOverLen=pchEnd-pchMessageEnd;
pchEnd=chrgMessage;
fTurn=1;
}
else
{
//the end pointer exceed the start pointor from back
if(fTurn && (pchEnd>pchStart))
{
pchStart=pchEnd;
*pchStart=255; //add a alarmer
}
}
wake_up_interruptible(&pSleep);
return nMessageLen;
}
我所说的版本问题已经解决了.
可以用ioctl来cancle掉被挂起的read.
#ifndef _DBGPRT_H_
#define _DBGPRT_H_
#define DBGPRT_IO_CANCLE 1
int DbgOpen(struct inode* i,struct file *f);
int DbgClose(struct inode* i,struct file *f);
ssize_t DbgRead (struct file* fileDbg, char* pchMsg, size_t nLen, loff_t* pOff);
int DbgIoCtl(struct inode* i,struct file *f,unsigned int cmd,unsigned long arg);
int DbgPrint(const char *fmt, ...);
#endif//_DBGPRT_H_
posted on 2009-12-30 14:06 alexhappy 阅读(208) 评论(0) 编辑 收藏 引用 所属分类: 调试技巧
linux内核 print,自定义linux内核调试print相关推荐
- Linux文本处理自定义,Linux中文本处理命令sed的使用示例分享
sed对文本的处理很强大,并且sed非常小,参数少,容易掌握,他的操作方式根awk有点像.sed按顺序逐行读取文件.然后,它执行为该行指定的所有操作,并在完成请求的修改之后的内容显示出来,也可以存放到 ...
- Linux Kernel - Debug Guide (Linux内核调试指南 )
linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...
- win10支持linux内核,Win10将允许您加载自定义Linux内核
微软正在为Win10添加一个Linux内核,以支持Linux的Windows子系统.但是,猜测一下:你不必使用微软的Linux内核.您可以构建自己的自定义Linux内核供Windows使用. 此功能是 ...
- Linux内核5.10编译 与调试
Linux内核5.10编译 与调试 Linux 5.10 编译 下载内核 准备编译环境 配置模板 编译 安装新内核 qemu 调试 busybox 根文件系统制作 qemu 运行 脚本二 方法三 目的 ...
- 嵌入式Linux设备驱动程序:编写内核设备驱动程序
嵌入式Linux设备驱动程序:编写内核设备驱动程序 Embedded Linux device drivers: Writing a kernel device driver 编写内核设备驱动程序 最 ...
- 初探内核之《Linux内核设计与实现》笔记上
内核简介 本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核 原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单. 2. 高 ...
- linux内核启动后门,Linux内核模块入门之简单内核后门
内核模块简介 Linux内核支持运行时动态扩展,即运行时动态加载内核扩展模块(.ko文件),ko文件所包含的代码经加载后即成为内核代码的一部分,拥有内核特权,可以调用内核其它组件,访问内核空间数据以及 ...
- linux内核优化脚本,linux内核高级优化脚本
linux内核高级优化脚本 可以用于hadoop生态圈环境的组件安装 linux内核调优 具体的每一步的解释请参考 03搭建cdh 备注:使用与centos6和centos7两个系统版本执行 [[em ...
- 初探内核之《Linux内核设计与实现》笔记下
定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...
- linux重启切换内核,centos7切换启动内核与切换启动模式的讲解
centos7切换启动内核 注:建议如果需要的话,可以先执行yum update -y,升级所有软件包 注意事项: 1.我用于测试的CentOS是7.2版本,默认最小化安装,系统内核是3.10.0-3 ...
最新文章
- Elasticsearch——Rest API中的常用用法
- 全球IP地址数周内用完,或现无法上网情况
- p3295 [SCOI2016]萌萌哒
- Android属性动画 实战-视差动画
- php怎么关闭oracle连接,PHP 连接 Oracle
- 卷积神经网络的几种典型架构
- idea常用设置_【收藏向】Intellij IDEA 使用法则(一) 设置
- 关于ie浏览器的问题
- 图像相似度对比分析软件,简单图像相似度对比图
- oracle pdb与cdb区别,浅谈oracle 12C的新特性-CDB和PDB
- 2015年8月4日工作日志--------赵鑫
- JS获取按键的代码,Js如何屏蔽用户的按键,Js获取用户按键对应的ASII码(兼容所有浏览器)...
- Honeywell EPKS通用中文操作手册
- DCDC开关电源学习
- Excel拆分合并数据,使用vb编程,效率提高50倍
- Java中的可变类型与不可变类型
- Spring学习第6篇: 基于注解使用IOC
- 无线交换机故障分析排查
- AD使用技巧——如何向AD里面导入图片(PCB打印图片、二维码)教程适用各个版本(17版及以前、18及以后、19、20、21版)(内附脚本文件下载)
- Python for 循环 控制步长
热门文章
- FreeType字体程序库介绍
- 计算机硬件系统包括哪几部分组成,计算机硬件系统由哪几部分组成
- 获取QQ音乐排行榜数据
- 原函数与反函数的关系
- Python网络爬虫与信息提取(二):网络爬虫之规则(Requests库 Robots规则)
- Verifying dml pool data
- Excel 技巧篇 - 选择性粘贴表格数据,excel只粘贴数值不粘贴公式
- oracle 物化视图 on demand,【案例】Oracle物化视图 on prebuilt table故障常见解决办法...
- 计算机网络 子网掩码
- TVB十大女星比美十大名花