SylixOS调试方法详解——性能分析

1. SylixOS调试方法介绍

SylixOS实现了一个功能强大的调试stub(桩),可在设备或模拟器上在线调试应用程序,RealEvo-IDE也提供配套的调试插件。目前RealEvo-IDE既支持自动推送调试、也支持传统的手动启动gdbserver的调试方式。在官方公布的使用手册中没有详细写出在日常开发中非常实用的几种调试方式,本文主要介绍性能分析的调试方法。

在日常开发过程中经常会遇到程序不够快的情况,但是不知道到底慢在哪里,往往是随意寻找函数优化,并没有没有真正定位到程序哪里慢,存在很大的偶然性。性能分析工具就是用动态采样的方式定位真正慢的位置,定位之后再在这个点上进行优化,最终程序运行时间对比是非常明显的。

2. SylixOS性能分析调试步骤详解

2.1.1   性能分析演示demo

SylixOS的性能分析主要是通过加载性能分析模块(sperfs.ko)来查看各个函数消耗的CPU时间,能够准确找到需要优化的点。下面通过建立一个“perfoms_check_app”来做性能分析调试的演示,代码如程序清单 21所示。

程序清单 21  static_check_app代码


//sperfstart sperfs

#include <stdio.h>

#define   USE_SLEEP

void module_sleep(int iSecond)

{

#ifdef USE_SLEEP

sleep(1);

#else

bspDelayUs(iSecond*1000*1000);

#endif

}

void calc_value(void)

{

static int i;

i++;

}

void do_something(void)

{

/*

*  do something

*/

calc_value();

module_sleep(1);

}

int main (int argc, char **argv)

{

while (1){

//     do_something();

}

return  (0);

}

2.1.2   加载性能分析模块(sperfs.ko)

(sperfs.ko模块为SylixOS性能分析检查提供一种调试工具)

点击IDE界面右上角“Device”;选择目标机器IP地址,这里使用的是虚拟机的IP地址:192.168.7.32,右击IP号打开“Launch FTP”进行传输;然后在本地文件夹中找到sperfs.ko模块,传输路径选择在“/lib/modules”目录下;最后双击sperfs.ko即可完成模块加载的准备工作,具体步骤如图 21所示。

图 21  加载sperfs.ko模块方法一

除上述方法外还可以通过“cp”指令将性能分析模块的拷贝在“/lib/modules”目录下,如图 22所示。

图 22  加载sperfs.ko模块方法二

完成后在“cd /lib/modules”目录下用“ls”查看是否完成拷贝,结果如图 22所示。

图 23  查看是否完成加载

然后通过“chmod”改变文件的权限,再用“modulereg”命令注册性能分析模块,如图 23所示。

图 24 注册内核模块

最后通过“sperfstart”命令开启性能分析的功能,再用“sperfs”命令查看性能分析结果,如图 24所示。

图 25  开启性能分析模块

除此之外我们通过Talnet再打开一个调试窗口,运行演示程序“perfoms_check_app”,性能分析结果如图 25所示,除空闲线程t_idleo和sperfs.ko外消耗CPU时间最多的函数是程序是performs_check中的main函数,在这里只需要优化该函数就可以减少程序运行时间。

图 26  性能分析结果

对该函数进行优化,优化结果如程序清单 22所示。

程序清单 22  main函数优化结果


int main (int argc, char **argv)

{

while (1){

do_something();

}

return  (0);

}

再次进行性能分析,结果如图 26所示,main函数消耗的CPU时间已经大大减少。

图 27  优化后性能分析结果

3. 总结

在SylixOS中可以使用多种调试方式进行相关调试,根据实际情况对程序进行调试,本节主要介绍性能分析检查工具。下一篇文档将通过一个完整的工程文件来描述多种调试方式。

4. 参考资料

《SylixOS应用程序开发手册》

《RealEvo-IDE使用手册》

时间: 2024-10-21 02:27:37

SylixOS调试方法详解——性能分析的相关文章

SylixOS 调试方法详解——静态代码分析

1. SylixOS调试方法介绍 SylixOS 实现了一个功能强大的调试 stub,可在设备或模拟器上在线调试应用程序,RealEvo-IDE 也提供配套的调试插件.目前 RealEvo-IDE 既支持自动推送调试.也支持传统的手动启动 gdbserver 的调试方式.在官方公布的使用手册中没有详细写出在日常开发中非常实用的几种调试方式,我们通过新建几个App工程来做相应的演示,主要有代码静态分析.代码覆盖率检查.性能分析以及一个实战案列的演示,本文主要介绍代码静态分析调试. 2. Sylix

opensips/kamailio gdb代码调试方法详解

 要对kamailio/opensips进行单步调试,就需要先了解其代码的结构及运行方式,kamailio/opensips使用Reactor和Proactor结合的IO网络模型,使用主进程负责监听网络,当有连接产生或首包到达时,就通过pipe将文件描述符发送给worker进程,worker进程就会负责此连接的数据取读.业务处理.数据发送等事情,然后再次等待此socket事件.当我们想要调试一段代码时,就先确认这段代码是运行在什么类型的进程中,通常用于处理SIP逻辑的代码都是在worker进

Java提高篇——equals()与hashCode()方法详解

java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类.所有的对象,包括数组,都实现了在Object类中定义的方法. equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下: public boolean equals(Object obj)

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例)

四种生成和解析XML文档的方法详解(介绍+优缺点比较+示例) 众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SAX:http://sourceforge.net/projects/sax/ JDOM:http://jdom.org/downloads/index.html DOM4J:http://sourceforge.

Windbg调试命令详解

发表于2013 年 8 月 23 日由张佩 转载注明>> [作者:张佩][原文:http://www.yiiyee.cn/Blog] 1. 概述 用户成功安装微软Windows调试工具集后,能够在安装目录下发现四个调试器程序,分别是:cdb.exe.ntsd.exe.kd.exe和Windbg.exe.其中cdb.exe和ntsd.exe只能调试用户程序,Kd.exe主要用于内核调试,有时候也用于用户态调试,上述三者的一个共同特点是,都只有控制台界面,以命令行形式工作. Windbg.exe在

php调用C代码的方法详解和zend_parse_parameters函数详解

http://blog.csdn.net/super_ufo/article/details/3863731 php调用C代码的方法详解 在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用 2 由于php的性能问题,需要用C来实现部分功能 针对第一种情况,最合适的方法是用system调用,把现有C代码写成一个独立的程序.参数通过命令行或者标准输入传入,结果从标准输出读出.其次,稍麻烦一点的方法是C代码写成一个daemon,php程序用socket来和它进行

Java AtomicInteger类的使用方法详解_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下: public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++; } } 以下是AtomicInteger的: public class Sample2 { private s

JavaScript原生对象属性和方法详解——Array对象 转载

length 设置或返回 数组中元素的数目. 注意:设置 length 属性可改变数组的大小.如果设置的值比其当前值小,数组将被截断,其尾部的元素将丢失.如果设置的值比它的当前值大,数组将增大,新的元素被添加到数组的尾部,它们的值为 undefined.所以length不一定代表数组的元素个数. var arr = new Array(3) arr[0] = "John" arr[1] = "Andy" arr[2] = "Wendy" cons

【转】深入学习JavaScript: apply call方法 详解(转)

Js apply方法详解 原文:http://blog.csdn.net/myhahaxiao/article/details/6952321 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家分享..  如有什么不对的或者说法不明确的地方希望读者多多提一些意见,以便共同提高.. 主要我是要解决一下几个问题: 1.        apply和cal