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

在调试代码的时候,经常需要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字符。

posted @ 2023-07-09 11:33  -ssdq-  阅读(21)  评论(0编辑  收藏  举报