调试信息过多造成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相关推荐

  1. Linux文本处理自定义,Linux中文本处理命令sed的使用示例分享

    sed对文本的处理很强大,并且sed非常小,参数少,容易掌握,他的操作方式根awk有点像.sed按顺序逐行读取文件.然后,它执行为该行指定的所有操作,并在完成请求的修改之后的内容显示出来,也可以存放到 ...

  2. Linux Kernel - Debug Guide (Linux内核调试指南 )

    linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...

  3. win10支持linux内核,Win10将允许您加载自定义Linux内核

    微软正在为Win10添加一个Linux内核,以支持Linux的Windows子系统.但是,猜测一下:你不必使用微软的Linux内核.您可以构建自己的自定义Linux内核供Windows使用. 此功能是 ...

  4. Linux内核5.10编译 与调试

    Linux内核5.10编译 与调试 Linux 5.10 编译 下载内核 准备编译环境 配置模板 编译 安装新内核 qemu 调试 busybox 根文件系统制作 qemu 运行 脚本二 方法三 目的 ...

  5. 嵌入式Linux设备驱动程序:编写内核设备驱动程序

    嵌入式Linux设备驱动程序:编写内核设备驱动程序 Embedded Linux device drivers: Writing a kernel device driver 编写内核设备驱动程序 最 ...

  6. 初探内核之《Linux内核设计与实现》笔记上

    内核简介  本篇简单介绍内核相关的基本概念. 主要内容: 单内核和微内核 内核版本号 1. 单内核和微内核   原理 优势 劣势 单内核 整个内核都在一个大内核地址空间上运行. 1. 简单. 2. 高 ...

  7. linux内核启动后门,Linux内核模块入门之简单内核后门

    内核模块简介 Linux内核支持运行时动态扩展,即运行时动态加载内核扩展模块(.ko文件),ko文件所包含的代码经加载后即成为内核代码的一部分,拥有内核特权,可以调用内核其它组件,访问内核空间数据以及 ...

  8. linux内核优化脚本,linux内核高级优化脚本

    linux内核高级优化脚本 可以用于hadoop生态圈环境的组件安装 linux内核调优 具体的每一步的解释请参考 03搭建cdh 备注:使用与centos6和centos7两个系统版本执行 [[em ...

  9. 初探内核之《Linux内核设计与实现》笔记下

    定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...

  10. linux重启切换内核,centos7切换启动内核与切换启动模式的讲解

    centos7切换启动内核 注:建议如果需要的话,可以先执行yum update -y,升级所有软件包 注意事项: 1.我用于测试的CentOS是7.2版本,默认最小化安装,系统内核是3.10.0-3 ...

最新文章

  1. Elasticsearch——Rest API中的常用用法
  2. 全球IP地址数周内用完,或现无法上网情况
  3. p3295 [SCOI2016]萌萌哒
  4. Android属性动画 实战-视差动画
  5. php怎么关闭oracle连接,PHP 连接 Oracle
  6. 卷积神经网络的几种典型架构
  7. idea常用设置_【收藏向】Intellij IDEA 使用法则(一) 设置
  8. 关于ie浏览器的问题
  9. 图像相似度对比分析软件,简单图像相似度对比图
  10. oracle pdb与cdb区别,浅谈oracle 12C的新特性-CDB和PDB
  11. 2015年8月4日工作日志--------赵鑫
  12. JS获取按键的代码,Js如何屏蔽用户的按键,Js获取用户按键对应的ASII码(兼容所有浏览器)...
  13. Honeywell EPKS通用中文操作手册
  14. DCDC开关电源学习
  15. Excel拆分合并数据,使用vb编程,效率提高50倍
  16. Java中的可变类型与不可变类型
  17. Spring学习第6篇: 基于注解使用IOC
  18. 无线交换机故障分析排查
  19. AD使用技巧——如何向AD里面导入图片(PCB打印图片、二维码)教程适用各个版本(17版及以前、18及以后、19、20、21版)(内附脚本文件下载)
  20. Python for 循环 控制步长

热门文章

  1. FreeType字体程序库介绍
  2. 计算机硬件系统包括哪几部分组成,计算机硬件系统由哪几部分组成
  3. 获取QQ音乐排行榜数据
  4. 原函数与反函数的关系
  5. Python网络爬虫与信息提取(二):网络爬虫之规则(Requests库 Robots规则)
  6. Verifying dml pool data
  7. Excel 技巧篇 - 选择性粘贴表格数据,excel只粘贴数值不粘贴公式
  8. oracle 物化视图 on demand,【案例】Oracle物化视图 on prebuilt table故障常见解决办法...
  9. 计算机网络 子网掩码
  10. TVB十大女星比美十大名花