首页 > 系统相关 >记录一个打印内存的日志函数

记录一个打印内存的日志函数

时间:2023-07-09 11:46:41浏览次数:45  
标签:addr buffer 打印 ++ 内存 offset 日志 0x0F hexstr

在调试代码的时候,经常需要dump一段内存,有时候不得不自己动手写一个函数。

现在先记录一个简单版本的内存打印函数。

const char* hexstr = "0123456789ABCDEF";

void dump(int level, const char* tag, const uint8_t* data, uint32_t length) {
#define _CNT_PER_LINE (1 << 4)
    char buffer[_CNT_PER_LINE * 3 + 10 + 2];
    int offset = 0;
    uint32_t addr;

    printf("[%s] dump %u byte(s):\n", tag, length);
    for (uint32_t i=0; i<length; ) {
        if (!(i & (_CNT_PER_LINE - 1))) {
            addr = (uint32_t)&data[i];
            buffer[offset++] = hexstr[(addr >> 28) & 0x0F];
            buffer[offset++] = hexstr[(addr >> 24) & 0x0F];
            buffer[offset++] = hexstr[(addr >> 20) & 0x0F];
            buffer[offset++] = hexstr[(addr >> 16) & 0x0F];
            buffer[offset++] = hexstr[(addr >> 12) & 0x0F];
            buffer[offset++] = hexstr[(addr >>  8) & 0x0F];
            buffer[offset++] = hexstr[(addr >>  4) & 0x0F];
            buffer[offset++] = hexstr[(addr >>  0) & 0x0F];
            buffer[offset++] = ':';
            buffer[offset++] = ' ';
        }
        buffer[offset++] = hexstr[(data[i] >> 4) & 0x0F];
        buffer[offset++] = hexstr[data[i] & 0x0F];

        i++;

        if (i & (_CNT_PER_LINE - 1)) {
            buffer[offset++] = ' ';
        } else {
            buffer[offset++] = '\n';
            buffer[offset] = '\0';
            printf("%s", buffer);
            offset = 0;
        }
    }

    if (offset) {
        buffer[offset++] = '\n';
        buffer[offset] = '\0';
        printf("%s", buffer);
    }
}

 

可以改进的地方:

1、将buffer从外部传进来;

2、将print函数由形参传进来;

3、在每一行的后面打印内存对应的ASCII字符。

标签:addr,buffer,打印,++,内存,offset,日志,0x0F,hexstr
From: https://www.cnblogs.com/ssdq/p/17538491.html

相关文章

  • java日志框架
    发展简图历程:使用logback+slf4j进行日志框架处理,出自一人之手,衔接更好! logback官网手册(英文):https://logback.qos.ch/manual/index.htmllogback中文手册:http://www.logback.cn/博客中文手册:https://blog.csdn.net/qq_26462567/article/details/115757354 ......
  • 打印沙漏
    本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印***************** 所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。给定任意N个符......
  • mysq事务、日志
    --实现事务的两种方式--关闭事务自动提交手动commit--开启事务然后提交--事务的四大特性--原子性(不可分割,要么全部成功,要么全部失败)--一致性(事务完成时,所有数据保证一致状态)--隔离性(数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运......
  • C++之内存模型
    背景C++内存模型是C++程序中内存管理和数据存储的基础。了解C++内存模型的概念和运作机制对于编写高效、安全的C++代码至关重要。本文将详细介绍C++内存模型的基本概念、内存分配策略以及与其相关的代码示例。C++内存模型的基本概念C++内存模型主要包括以下几个部分:静态存储......
  • (MySQL)开启慢查询日志
    MySQL的慢查询日志默认没有开启,我们可以查看一下系统变量slow_query_log。showvariableslike'slow_query_log';修改/etc/my.ini如果要开启慢查询日志,需要在MySQL的配置文件(E:\ProgramData\MySQL\MySQLServer8.0\my.ini)中配置如下信息:#开启MySQL慢日志查询开关slow_......
  • kubelet编译和输出日志
    编译kubeletyuminstall-ygccgoenv-wGO111MODULE="off"cd$GOPATH/src/k8s.io/kubernetes/cmd/kubeletgoinstall-v替换kubeletsystemctlstopkubelet.servicemv/usr/bin/kubelet/usrmv$GOPATH/bin/kubelet/usr/binsystemctlstartkubelet.service......
  • 使用STM32的usb虚拟串口CDC_Transmit_FS打印freertos的任务列表vTaskList
    创建一个任务,打印信息后,把自己删除/*USERCODEENDHeader_func_showSysInfo*/voidfunc_showSysInfo(voidconst*argument){/*USERCODEBEGINfunc_showSysInfo*//*Infiniteloop*/for(;;){osDelay(1000);chartaskList[200];......
  • AOP日志切面拦截出现异常:java.lang.IllegalStateException: It is illegal to call th
    问题描述一个下载功能,后端代码出现异常,被AOP的日志切面拦截,出现异常。具体异常如下:java.lang.IllegalStateException:Itisillegaltocallthismethodifthecurrentrequestisnotinasynchronousmode(i.e.isAsyncStarted()returnsfalse) atorg.apache.catali......
  • apache日志切割和保持访问
    日志切割的作用和方式Centos01切换云计算光盘安装apache编译安装优化apache命令生成服务控制文件添加执行权限修改服务控制文件添加到系统服务设置开机自动启动服务修改网站主页切换系统盘生成验证数据库修改apache主配置文件加载基本身份验证功能重启服务日志切割(rotatelogs)登陆一......
  • pytest + yaml 框架 -48.仅收集用例失败错误信息和log日志
    前言有小伙伴提到能不能只收集用例失败的情况下日志和错误信息,每个用例都收集日志内容太多了,没法直观的看错误的用例信息。v1.3.9版本实现此功能,在原有的功能上新增一个log日志文件,仅收集用例错误的日志。log日志收集用例执行完会默认生成2个日志文件全量日志,每个用例的日......