linux kernel将关键信息保存到文件做法 很好的调试方法

linux kernel将关键信息保存到文件做法      很好的调试方法

下面有2个示例:

1:保存机器从开机到结束的VBATT;

2:保存uart接收到的数据到文件;

意义不多说了。

以下是代码:

#include <linux/fs.h>
#include <asm/uaccess.h>
#include <asm/unaligned.h>

static  struct file *fp =NULL;

int  write_to_file (char *buf, int size)
{
     int ret = 0;
     struct file *fp;
     mm_segment_t old_fs;
     loff_t pos = 0;
     int nwrite = 0;
     static int offset = 0;
     static int first_flag=0;

     /* change to KERNEL_DS address limit */
     old_fs = get_fs();
     set_fs(KERNEL_DS);

     if( first_flag==0){
     first_flag=1;
     /* open file to write */
     fp = filp_open("/data/at_log1", O_WRONLY|O_CREAT, 0640);
     if (!fp) {
         printk("%s: open file error\n", __FUNCTION__);
         ret = -1;
         goto exit;
         }
     }
     pos=(unsigned long)offset;

     /* Write buf to file */
     nwrite=vfs_write(fp, buf, size, &pos);
     offset +=nwrite;

exit:

     return ret;
}

int xxxx_exit(void){
if (fp)
          filp_close(fp, NULL);
}

1:保存VBATT与SOC:

static int adjust_soc(struct pm8921_bms_chip *chip, int soc,
        int batt_temp, int chargecycles,
        int rbatt, int fcc_uah, int uuc_uah, int cc_uah)
{
    ------------
   static char vbatt[100];
    rc = pm8921_bms_get_simultaneous_battery_voltage_and_current(
                            &ibat_ua,
                            &vbat_uv);
    if (rc < 0) {
        pr_err("simultaneous vbat ibat failed err = %d\n", rc);
        goto out;
    }

    chip->vbat_mv= vbat_uv/1000;
    sprintf(vbatt,"%d        %d\n",the_chip->vbat_mv,calculated_soc);
    write_to_file(vbatt,strlen(vbatt));
    ----------
}

2:将串口接收到的字符转化为16进制保存到文件中:

static void msm_serial_hs_rx_tlet(unsigned long tlet_ptr)
{

    ---------------
    static char temp[1024];

    rx_count = msm_hs_read(uport, UARTDM_RX_TOTAL_SNAP_ADDR);

    /* order the read of rx.buffer */
    rmb();

    if (0 != (uport->read_status_mask & CREAD)) {
        retval = tty_insert_flip_string(tty, msm_uport->rx.buffer,
                        rx_count);
        if (retval != rx_count) {
            msm_uport->rx.buffer_pending |= CHARS_NORMAL |
                retval << 5 | (rx_count - retval) << 16;
        }
        if(rx_count<=512){
            //memcpy(temp,msm_uport->rx.buffer,rx_count);
            for(i=0;i<rx_count;i++){
            sprintf(temp+2*i,"%02x",msm_uport->rx.buffer[i]);
            write_to_file(temp,strlen(temp));
            }

        }
          ----------------
}

时间: 2024-12-10 01:54:40

linux kernel将关键信息保存到文件做法 很好的调试方法的相关文章

jmeter 发送http请求,并把获取到的请求的订单信息保存到文件中

有一个任务,需要频繁发送订单请求,并分析订单请求中有没有存在重复订单号,思路是用jmeter 发送http请求,使用正则表达式获取到订单号,并把订单号和线程号作为参数提供给java请求,在java请求中把订单号写到包括有线程号的命名文件中.完成出来的样子是这样的 步骤如下: 1.Jmeter 发送http请求 1) 新建HTTP信息头管理器 2) 新建HTTP请求 2,在下单过后返回部分信息如下:"msg":"下单成功","result":&qu

linux设备驱动第四篇:以oops信息定位代码行为例谈驱动调试方法

上一篇我们大概聊了如何写一个简单的字符设备驱动,我们不是神,写代码肯定会出现问题,我们需要在编写代码的过程中不断调试.在普通的c应用程序中,我们经常使用printf来输出信息,或者使用gdb来调试程序,那么驱动程序如何调试呢?我们知道在调试程序时经常遇到的问题就是野指针或者数组越界带来的问题,在应用程序中运行这种程序就会报segmentation fault的错误,而由于驱动程序的特殊性,出现此类情况后往往会直接造成系统宕机,并会抛出oops信息.那么我们如何来分析oops信息呢,甚至根据oop

49.将手机收藏信息保存到文件中

import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.Docu

python练习题1优化:用户信息保存到文件

需求: 控制台根据用户选择实现: 1.添加用户(个别信息必填)add user 2.展示用户列表 list user 3.根据名字搜索用户信息 search user 4.根据名字修改用户信息 modify user 5.退出 exit def add_user(): filename=raw_input("你想保存到的文件名称为:") fo=open(filename,"a") print "请输入保存信息内容:" choise="y

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

http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 建立调试环境 发行版的选择和安装 安装交叉编译工具 bin工具集的使用 qemu的使用 initrd.img的原理与制作 x86虚拟调试环境的建立 arm虚拟调试环境的建立 arm开发板调试环

学好linux kernel的方法

学好linux kernel的方法 学好linux kernel的方法是:1)买本好书,先学习整体和概念和细节.2)由于linux代码不断变化,所以书上代码不用太细看,只要有关键函数和结构体及其关键成员就行.3)记下书中提到的概念,重要结构体,重要结构体关系图,重要函数api,但注意结构和函数也是会变的.4)记下提到的概念和实现方法思路后,例如如何节省内存的,如何更高效率的,如何保证唯一入口函数从而更好控制的,以后对着最新代码学习就行,有些可以通过网上文章学习.5)注册关于memory和进程管理

Linux Kernel CMPXCHG函数分析

最近看到Linux Kernel cmpxchg的代码,对实现很不理解.上网查了内嵌汇编以及Intel开发文档,才慢慢理解了,记录下来以享和我一样困惑的开发者.其实cmpxchg实现的原子操作原理早已被熟知: cmpxchg(void* ptr, int old, int new),如果ptr和old的值一样,则把new写到ptr内存,否则返回ptr的值,整个操作是原子的.在Intel平台下,会用lock cmpxchg来实现,这里的lock个人理解是锁住内存总线,这样如果有另一个线程想访问pt

Linux内核调试方法总结之序言

本系列主要介绍Linux内核死机.异常重启类稳定性问题的调试方法. 在Linux系统中,一切皆为文件,而系统运行的载体,是一类特殊的文件,即进程.因此,我尝试从进程的角度分析Linux内核的死机.异常重启等问题.在内核空间,内核本身是一个特权级的进程,它包含一系列系统级线程,维护整个系统内核的运转.在用户空间,有很多用户进程实现不同的功能,它们有的是独立运行,有些相互之间有依赖(同步或者互斥).在32位系统中,内核进程独享3GB~4GB的高1GB内存空间,而每个用户进程则分别占据0GB~3GB的

Linux kernel的中断子系统之(六):ARM中断处理过程

一.前言 本文主要以ARM体系结构下的中断处理为例,讲述整个中断处理过程中的硬件行为和软件动作.具体整个处理过程分成三个步骤来描述: 1.第二章描述了中断处理的准备过程 2.第三章描述了当发生中的时候,ARM硬件的行为 3.第四章描述了ARM的中断进入过程 4.第五章描述了ARM的中断退出过程 本文涉及的代码来自3.14内核.另外,本文注意描述ARM指令集的内容,有些source code为了简短一些,删除了THUMB相关的代码,除此之外,有些debug相关的内容也会删除. 二.中断处理的准备过