Windows mobile 适用于Windows CE/Mobile的代码分析/性能分析工具

Windows mobile 适用于Windows CE/Mobile的代码分析/性能分析工具,windows-mobile,windows-ce,native,profiling,Windows Mobile,Windows Ce,Native,Profiling,除了Visual Studio中的工具外,您还知道哪些工具可以分析Windows CE/Mobile应用程序中的性能瓶颈?我正在寻找类似AQTime for CE/Mobile的东西,以分析编译为本机代码的C/C++应用程序。如果您正在进行.NET CF开发,请查看可帮助您查明瓶颈的实用程序,尤其是与内存相关的瓶颈 我还没有找到任何用于WindowsMobile本机开发的此类工具 我找到的最接近的工具是EnTrek工具集(CodeSnitch/ProcMan),但它们不是真正的评测工具。 我们

除了Visual Studio中的工具外,您还知道哪些工具可以分析Windows CE/Mobile应用程序中的性能瓶颈?我正在寻找类似AQTime for CE/Mobile的东西,以分析编译为本机代码的C/C++应用程序。

如果您正在进行.NET CF开发,请查看可帮助您查明瓶颈的实用程序,尤其是与内存相关的瓶颈

我还没有找到任何用于WindowsMobile本机开发的此类工具

我找到的最接近的工具是EnTrek工具集(CodeSnitch/ProcMan),但它们不是真正的评测工具。

我们所做的是使用VC++的vistualstudio“/callcap”开关将自己的评测支持构建到自己的产品中。使用该开关,您可以构建一个分析库,它可以根据您的喜好转储计时和计数。它通常对我们来说效果很好,但有时这些钩子函数的开销可能太大,并且会将计时结果倾斜到大量函数调用的区域

从MSDN文档:

/callcap选项导致 编译器插入对分析的调用 在每一节的开头和结尾都有挂钩 功能

您必须编译分析钩子 没有callcap开关。如果你 编译分析钩子函数 使用callcap开关,功能 将执行无限递归调用 对他们自己

下面的代码示例, c,显示了一个分析钩子 函数,\u CAP\u Enter\u函数,用于 没有callcap的编译

//文件:callcaphooks.c
#包括
int main();
void _CAP _Enter _函数(void*p)
{
如果(p!=主)
printf(“在%d处输入函数(地址%p)\n”,
p、 GetTickCount());
返回;
}
void _CAP _Exit _函数(void*p)
{
如果(p!=主)
printf(“在%d离开函数(地址%p)\n”,
p、 GetTickCount());
返回;
}
Windows CE支持开箱即用(如果OEM增加了对它的支持)。我相信WinMo映像通常已经在映像中提供了对它的支持。对于CE,需要设置IMAGEPROFILER环境变量集(在项目属性下)

MSDN中不清楚的是如何为没有使用Platform Builder构建的应用程序添加工具,但实际上非常简单。您必须将/callcap swith添加到编译器命令行,并将cecap.lib添加到链接器设置中

当然,您需要一个工具来捕获和显示探查器数据。为此,您可以使用Platform Builder的评估版本(或)(评估是免费的)或(也是免费的)


有关探查器用法的更多信息,CE core团队的Sue Loh在博客中对此进行了介绍。

我为Windows Mobile编写了一个调用图探查器。它目前(截至2010年1月)处于测试阶段,可以免费下载


-Zak

对不起,我应该提到,我知道Power Toys,但就我而言,它们不能使用,因为代码是本地的。谢谢,Shane。正如你所说,这不是我想要的。但这仍然是一个很好的暗示。我已经有了一些用于分析的实用程序类,但直到现在,我只是通过可疑代码中的宏手动添加它们。+1感谢您的建议。这是一个救命稻草:)疯狂地优化了我的blitter的分析数据。看起来很有希望,我会尝试一下。
// File: callcaphooks.c

#include <stdio.h>
int main();

void _CAP_Enter_Function(void *p) 
{
    if (p != main) 
        printf("Enter function   (at address %p) at %d\n", 
            p, GetTickCount());
        return;
}
void _CAP_Exit_Function(void *p) 
{
    if (p != main) 
        printf("Leaving function (at address %p) at %d\n", 
            p, GetTickCount());
    return;
}