前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Tool之MemScope

Tool之MemScope

作者头像
Taishan3721
发布2021-11-12 18:32:32
3470
发布2021-11-12 18:32:32
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks

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()%10)
            {
            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好多年!

一起学习 共同进步!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档