Tool之MemScope

2021-11-12 18:32:32 浏览数 (1)

WindRiver在2005年收购了一套叫做ScopeTools的软件。其中包含一个MemScope,不过从Vx67开始,改名为Memroy Analyzer

这个工具能干什么

  • 查找内存泄漏。在它的Aggregate视图里,可以看到未释放的内存,这些就有可能存在内存泄漏
  • 查看每个程序的内存使用情况。在Tree视图里,动态显示每个程序使用的内存数量及分配位置
  • 显示动态内存分配。在Time视图里,以图形方式查看内存的分配和释放
  • 查看内存使用效率。通过call stack查看Heap的使用情况,用于判断内存的占用情况和使用效率

随便跑个例子,就知道它怎么用了,例如这个代码,加到VxWorks 6里

代码语言:javascript复制
#include <stdLib.h>
#include <taskLib.h>

#define BLOCK_SZ (1024)

void testMemScope()
{
    char *mem_ptr[10];
    int allocated[10] = {0};

    for(;;)
        {
        switch(rand())
            {
            case 0:
                if(allocated[0] == 0)
                    {
                    mem_ptr[0] = (char *)malloc(1*BLOCK_SZ);
                    allocated[0] = 1;
                    }
                else
                    {
                    free((void *)mem_ptr[0]);
                    allocated[0]=0;
                    }
                break;

            case 1:
                if(allocated[1] == 0)
                    {
                    mem_ptr[1] = (char *)malloc(2*BLOCK_SZ);
                    allocated[1] = 1;
                    }
                else
                    {
                    free((void *)mem_ptr[1]);
                    allocated[1]=0;
                    }
                break;

            case 2:
                if(allocated[2] == 0)
                    {
                    mem_ptr[2] = (char *)malloc(3*BLOCK_SZ);
                    allocated[2] = 1;
                    }
                else
                    {
                    free((void *)mem_ptr[2]);
                    allocated[2]=0;
                    }
                break;

            case 3:
                if(allocated[3] == 0)
                    {
                    mem_ptr[3] = (char *)malloc(4*BLOCK_SZ);
                    allocated[3] = 1;
                    }
                else
                    {
                    free((void *)mem_ptr[3]);
                    allocated[3]=0;
                    }
                break;

            case 4:
                if(allocated[4] == 0)
                    {
                    mem_ptr[4] = (char *)malloc(5*BLOCK_SZ);
                    allocated[4] = 1;
                    }
                else
                    {
                    free((void *)mem_ptr[4]);
                    allocated[4]=0;
                    }
                break;

            case 5:
                if(allocated[5] == 0)
                    {
                    mem_ptr[5] = (char *)malloc(6*BLOCK_SZ);
                    allocated[5] = 1;
                    }
                else
                    {
                    free((void *)mem_ptr[5]);
                    allocated[5]=0;
                    }
                break;

            case 6:
                if(allocated[6] == 0)
                    {
                    mem_ptr[6] = (char *)malloc(7*BLOCK_SZ);
                    allocated[6] = 1;
                    }
                else
                    {
                    free((void *)mem_ptr[6]);
                    allocated[6]=0;
                    }
                break;

            case 7:
                if(allocated[7] == 0)
                    {
                    mem_ptr[7] = (char *)malloc(8*BLOCK_SZ);
                    allocated[7] = 1;
                    }
                else
                    {
                    free((void *)mem_ptr[7]);
                    allocated[7]=0;
                    }
                break;

            case 8:
                if(allocated[8] == 0)
                    {
                    mem_ptr[8] = (char *)malloc(9*BLOCK_SZ);
                    allocated[8] = 1;
                    }
                else
                    {
                    free((void *)mem_ptr[8]);
                    allocated[8]=0;
                    }
                break;

            case 9:
                if(allocated[9] == 0)
                    {
                    mem_ptr[9] = (char *)malloc(10*BLOCK_SZ);
                    allocated[9] = 1;
                    }
                else
                    {
                    free((void *)mem_ptr[9]);
                    allocated[9]=0;
                    }
                break;

            default:
                break;
            }
        taskDelay(60);
        }
    }

代码很简单,启动VxWorks 6后,在WorkBench里已连接的Target Connection上右击,选择Attach Memory Analyzer

在WorkBench中央位置就会打开Memory Analyzer的窗口

这时启动应用程序,几秒钟之后,就可以看到程序里内存的使用情况了

可以看到程序里使用的每块内存的位置、时间等信息。如果支持源码级的debug,在Tree视图里,还能看到申请/释放每块内存的源码语句

非常强大的工具,VxWorks卖的贵,是有原因滴

我是泰山 专注VX好多年!

一起学习 共同进步!

0 人点赞