QNX常用调试方法

QNX常用调试方法

1. top
查询系统状态最常用的工具是top,它可以显示系统资源的使用情况。我们最关心的通常是系统可用内存和CPU使用率。如果CPU使用率过高可能是因为某些应用存在bug,重点关注下面显示的占用CPU资源最多的几个线程。如果可用内存太少,可能某些应用存在内存泄漏情况。但top工具无法显示占用内存最多的应用,我们可以使用另外一个工具hogs。

2. hogs
hogs工具和top类似,默认也是按照CPU使用情况对进程进行排序。但可以指定-S m参数使其按内存使用情况排序,这样就能揪出消耗内存最多的几个进程了。知道了哪个进程消耗内存最多,我们还是无法判断它是否存在内存泄漏,因为无法判断占用内存多的是哪部分。如果能看到该进程的Heap越来越大,才可以确认它存在内存泄漏。
在这里插入图片描述
ages/20230724024159.png?origin_url=file%3A%2F%2F%2F%2Ftmp%2Fwps-dgliu%2Fksohtml%2FwpsVEMXl1.jpg&pos_id=img-vCzAtoL1-1701587889811)

3. pidin
锁定了嫌疑进程后就可以对其进行详细信息查询了。在QNX上查询进程信息最基本的工具是pidin,它类似Linux上的ps命令。这两个工具在QNX上都是基于proc文件系统实现的,但pidin比ps功能要更强大。pidin的命令行参数支持六十多种格式码,每个格式码代表一种信息,可任意组合。估计该工具的作者怕使用者记不住这么多参数,又提供了一些shorthand,就是一些预设的格式码组合。常用的有:arg用于显示进程参数,fds用于显示进程打开的连接和文件,user用于显示进程的用户信息等。pidin默认显示所有进程的信息,如只想查询指定进程信息,可用-p参数指定进程名或pid。
在这里插入图片描述

性能分析工具

   有时调试进程不一定是因为应用存在逻辑bug,也可能是应用性能无法满足需求,例如处理某个函数耗时过长,或CPU占用率过高。这时就需要对应用进行性能分析,从而找到优化方案。这时可以考虑使用tracelogger。

1. tracelogger
如果想知道QNX内核在一段时间内都干了什么,最常用的工具就是tracelogger了。该工具可以将内核事件记录到.kev文件中进行分析。kev表示kernel event,包括系统调用、调度行为、中断处理以及进程和线程的创建、销毁和状态改变等等。这些事件都来自procnto*-instr,开始记录后内核会将事件信息保存到内存buffer中,每个buffer的大小为16KB,buffer数量由tracelogger设置,默认32个。记录完成后tracelogger会将buffer中的数据转储到指定的kev文件中。
手动启动tracelogger的方式比较灵活,可用-n参数指定buffer个数,当存满这么多buffer后就停止记录,如:
tracelogger -f /var/log.kev -n 12
也可以用-s指定时间,单位是秒,记录这么长时间后就停止,如:
tracelogger -f /var/log.kev -s 3
也可以用-r指定循环模式,记录过程buffer中的数据会循环覆盖,不会写入kev文件,直到用户按Ctrl+C才停止,然后将buffer中的数据写入文件。
tracelogger -f /var/log.kev -r -b 5
得到kev文件后可用traceprinter工具进行解析,也可以用Momentics IDE进行解析。
traceprinter只是按顺序将内核事件解析成文本格式,不方便过滤分析,但这个工具是SDK自带的,无需额外购买license。解析的结果如下图所示:
在这里插入图片描述
Momentics IDE提供图形化解析工具,可过滤感兴趣的进程和事件,功能强大,使用方便,但需要购买license。解析结果如下图所示

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

进程监测工具

即使实验室中充分测试过的软件也无法保证在真实工况下不崩溃,毕竟物理世界有太多意想不到的情况。我们能做的只有在应用异常退出时,尽量自动恢复其功能。可以说进程监控工具是保障运行时功能的最后一道防线。QNX提供了两个工具可以监控进程,并在其异常退出时重启该进程,即SLM和HAM。下面简单介绍一下这两个工具。

1. SLM
SLM是System Launch and Monitor的缩写,用于启动和监控必须按指定顺序启动的复杂应用。SLM使用XML文件作为配置文件,将待启动的应用在xml文件中配置好,启动slm时指定该xml文件即可,如:
/bin/slm -V /slm/service_apps.xml
以下面的代码片段为例,简单介绍下slm配置文件的用法。每个进程都是一个component,该文件定义了两个component,分别是chime_service和ic_chime。type指定进程的安全类型,user指定进程的用户和组,command指定启动命令行,waitfor等待路径名出现,priority指定优先级和调度策略,partition指定aps分区,depend指定依赖的component,stdout和stderr重定向标准输出和标准错误。

   <SLM:component name="chime_service"><SLM:type>chime_service_t</SLM:type><SLM:user>chime:iceoryx</SLM:user><SLM:command launch="pathname">/bin/chime_service</SLM:command><SLM:waitfor wait="pathname">/dev/chime_service</SLM:waitfor><SLM:priority>10r</SLM:priority><SLM:partition>aps_ic</SLM:partition></SLM:component><SLM:component name="ic_chime"><SLM:depend>chime_service</SLM:depend><SLM:type>ic_apps_t</SLM:type><SLM:user>ic_apps:iceoryx</SLM:user><SLM:command launch="pathname">/usr/bin/ic_chime</SLM:command><SLM:priority>10r</SLM:priority><SLM:partition>aps_ic</SLM:partition><SLM:stdout>/dev/slog2/stdout</SLM:stdout><SLM:stderr iomode="a">/dev/slog2/stderr</SLM:stderr></SLM:component>这段配置的意思是ic_chime依赖chime_service,slm会先启动chime_service,等待/dev/chime_service设备出现后再启动ic_chime。如果chime_service异常退出了,slm会先把ic_chime杀死,然后重启chime_service,再重启ic_chime。SLM的优点是可以处理进程间的依赖关系,但在进程退出时它只能重新启动该进程,无法执行其他动作。有时关键进程退出后,由于依赖它的进程太多了,依次杀掉所有进程后再重启一遍,还不如直接重启系统方便。

2. HAM
HAM是High Availability Manager的缩写,它能提供一种监控进程的机制。HAM的结构主要包括三部分:实体、条件、动作。每个被监控的进程都是一个实体,其下可注册多个条件,每个条件下可注册多个动作。一旦被监控的进程满足预设的条件,即可执行相应的动作。所有注册到HAM的实体都可以在/proc/ham目录下看到其状态。
下面的代码片段的功能就是将进程本身注册到HAM。首先用ham_attach_self()注册一个实体,名为”sys_monitor”,HAM监控的pid即为该进程本身的pid;然后用ham_condition()在该实体下注册一个条件,类型为CONDDEATH;最后在这个条件下注册一个restart动作。当该进程死掉时HAM就会执行预设的动作,调用/bin/sys_monitor命令行。新起来的进程又会执行同样的代码将新pid再次注册到HAM。

   static int32_t attach_self_to_ham(){ham_entity_t *ehdl;ham_condition_t *chdl;ham_action_t *ahdl;/* attach to HAM */ehdl = ham_attach_self("sys_monitor", 0, 0, 0, 0);/* register a DEATH event condition */chdl = ham_condition(ehdl, CONDDEATH, "death", HREARMAFTERRESTART);/* tell HAM to restart sys_monitor in case it crashes */ahdl = ham_action_restart(chdl, "restart", "/bin/sys_monitor", HREARMAFTERRESTART);return 0;}HAM虽然可以自定义条件和动作,但使用HAM的应用都要添加相应代码,太过麻烦,而且有些系统工具我们没有源码无法添加新功能。最重要的是HAM不支持指定安全类型。在启用了secpol的系统中,启动应用时通常要用on命令指定security type和user等信息。但如果ham_attach()或ham_action_restart()里的命令行也用on来启动,则ham监控的就是on的pid,而不是要启动的应用的pid。如果应用代码中调用了daemon()函数,那on就会退出。ham则会认为实体退出了从而再次执行该命令行。导致应用被多次误启动。

3. 小结
SLM、HAM各有优缺点,实际项目中可根据具体需求选择使用哪个工具。两个工具的优缺点对比如下表。
在这里插入图片描述

其它IDE的调试方法

http://www.qnx.com/developers/docs/7.0.0/index.html#com.qnx.doc.ide.userguide/topic/analyze_performance.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基本计算器[困难]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个字符串表达式s&#xff0c;请你实现一个基本计算器来计算并返回它的值。注意:不允许使用任何将字符串作为数学表达式计算的内置函数&#xff0c;比如eval()。 示例 1&#xff1a; 输入&#xff1a;s "1 1" 输出…

Python 内置异常

目录 异常上下文 从内置异常继承 基类 具体异常 OS 异常 警告 异常组 异常层次结构 在 Python 中&#xff0c;所有异常必须为一个派生自 BaseException 的类的实例。 在带有提及一个特定类的 except 子句的 try 语句中&#xff0c;该子句也会处理任何派生自该类的异常类…

oops-framework框架 之 资源管理(四)

引擎&#xff1a; CocosCreator 3.8.0 环境&#xff1a; Mac Gitee: oops-game-kit 注&#xff1a; 作者dgflash的oops-framework框架QQ群&#xff1a; 628575875 简介 在CocosCreator中&#xff0c;资源可以分为两大类&#xff1a; 静态引用资源动态引用资源&#xff0c;包…

瞥一眼 FAT32,手撸文件系统

FAT 32 FAT(File Allocation Table)&#xff0c;最早在DOS v1.0 中被引入&#xff0c;是一种极简的文件系统&#xff0c;占用空间&#xff0c;是目前最常见的文件系统之一。 发展历程 FATX系列文件系统的不同版本都是针对不同的文件存储介质&#xff08;storage media&#…

Fisher信息理论与应用

一、概念介绍 Fisher信息量&#xff0c;是一次观测值所能提供的关于未知参数θ的信息量期望值的一种度量。 Fisher信息矩阵&#xff0c;是用利用最大似然函数估计来计算方差矩阵&#xff0c;表示随机变量的一个样本所能提供的关于状态参数在某种意义下的平均信息量。 Fisher…

node.js express路由和中间件

目录 路由 解释 使用方式 中间件 解释 使用方式 中间件类型 路由注册和中间件注册 代码 app全局路由接口请求以及代码解析 示例1 示例2 示例3 示例4 中间件req继承 嵌套子路由 解释 代码 示例1 路由 解释 在 Express 中&#xff0c;路由&#xff08;Route&…

【Qt开发流程】之事件系统3:键盘事件

序章 以下链接是拖放事件介绍和使用示例&#xff1a; 【Qt开发流程】之拖放操作1:介绍链接: https://blog.csdn.net/MrHHHHHH/article/details/134626484 【Qt开发流程】之拖放操作2:使用链接: https://blog.csdn.net/MrHHHHHH/article/details/134632006 以下链接是事件系统…

百度智能云推出“千帆AI原生应用开发工作台” 助力开发者创新

在这个智能互联的世界&#xff0c;每一次技术的飞跃都预示着无限可能。你是否曾梦想&#xff0c;一款产品能够打破创新的边界&#xff0c;让开发不再是高门槛的技术挑战&#xff1f;12月20日&#xff0c;百度云智大会智算大会将为你揭开这幕神秘面纱——“千帆AI原生应用开发工…

orvibo旗下的VS30ZW网关分析之一

概述 从官网的APP支持的智能中枢来看,一共就两种大类: MixPad系列和网关系列 排除MixPad带屏网关外,剩余的设备如下图: 目前在市场上这四种网关已经下市,官方已经宣布停产。所以市场上流通的也几乎绝迹。 从闲鱼市场上可以淘到几个,拿来分析一下,这里我手头有如下的两…

配置typroa上传图片到gitee

在typora这个位置下载插件 在picgo.exe文件夹下输入cmd 打开命令行输入如下命令安装相关插件 .\picgo install gitee-uploader .\picgo install super-prefix 之后按照官方文档更改相关配置 官方文档参考 https://picgo.github.io/PicGo-Core-Doc 博客参考&#xff1a;…

抑郁症中西医治疗对比?

抑郁症是一种常见的心理障碍&#xff0c;治疗方法包括中医和西医两种。下面就抑郁症中西医治疗进行对比&#xff1a; 治疗方法&#xff1a;中医治疗抑郁症强调整体观念和辨证论治&#xff0c;通过调理身体各部分的功能&#xff0c;达到治疗抑郁症的目的。中医治疗抑郁症多采用天…

矩阵的条件数及病态方程组的处理

对 A x b Axb Axb,如果A或者b有轻微的变动,会使得求解出的 x x x发生巨变,这种矩阵就是病态的 A x b Axb Axb 真实情况 A ( Δ x x ) Δ b b A(\Delta xx)\Delta bb A(Δxx)Δbb 代入误差的扰动情况 Δ x A − 1 Δ b \Delta xA^{-1}\Delta b ΔxA−1Δb 取范数后有 ∣…

人体姿态估计算法

人体姿态估计算法 1 什么是人体姿态估计2 基于经典传统和基于深度学习的方法2.1 基于经典传统的人体姿态估计算法2.2 基于深度学习的人体姿态估计算法OpenPoseAlphaPose (RMPE) 3 算法应用4 Paper 人体姿态估计在现实中的应用场景很丰富&#xff0c;如下 动作捕捉&#xff1a;三…

Android String.xml 设置加粗字体/修改字体颜色/动态设置修改文案

之前经常使用Spannable 这次主要在String.xml使用&#xff1a;<![CDATA[和]]> 效果&#xff1a; <resources><string name"str_bianse"><![CDATA[变色 <font color"#ff0000">曲项向天歌</font> 白毛浮绿水]]></st…

idea新建spring boot starter

什么是spring boot starter Spring Boot Starter 是一种 Maven 或 Gradle 依赖&#xff0c;它能够轻松地将相关库和框架集成到 Spring Boot 应用程序中。Starter 是一种对常见依赖项和设置的易于复用的封装&#xff0c;它们通常被开发人员用于创建可插拔的 Spring Boot 应用程序…

信息学奥赛一本通1190:上台阶

1190&#xff1a;上台阶 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 69016 通过数: 23589 【题目描述】 楼梯有n(0<n<71)阶台阶,上楼时可以一步上1阶,也可以一步上2阶,也可以一步上3阶&#xff0c;编程计算共有多少种不同的走法。 【输入】 输入的每一行…

SCAU:各位数字

各位数字 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC 描述 从键盘输入一个3位数的正整数&#xff0c;要求先后输出该数的百位数字与个位数字&#xff0c;各占一行输入格式 一个三位整数输出格式 输出该数的百位数字与个位数字输入样例 123输出…

报考公务员简历(精选8篇)

想要成功进入公务员队伍&#xff0c;一份出色的个人简历是必不可少的。本文为大家精选了8篇报考公务员的个人简历案例&#xff0c;无论是应届毕业生还是有工作经验的求职者&#xff0c;都能从中汲取灵感&#xff0c;提升简历质量。找到心仪的公务员岗位。 报考公务员简历模板下…

迭代器模式-C++实现

题外话&#xff1a; 设计模式是在1994年提出的&#xff0c;当时还没有C的STL库和泛型编程&#xff0c;所以人们为了提供一种有效的方法来访问一个聚合对象&#xff08;例如列表、集合、数组等&#xff09;中的元素&#xff0c;而又不暴露该对象的内部表示&#xff0c;于是想到了…

Pandas在Excel同一个sheet里插入多个Dataframe和行

Pandas默认的to_excel是直接把完成的Datafrme写入一个sheet里,这并不能满足我们在一个sheet里插入多个Dataframe或多行的需求。为了实现插入多行或多Dataframe的目的,我们需要新建一个ExcelWriter对象,然后依次插入数据。 这里我们以插入2个Dataframe和三行单元格为例。 新…