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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

史上最全低代码平台盘点!三分钟盘点2023年顶尖二十个低代码平台!

史上最全低代码平台盘点&#xff01;三分钟盘点2023年顶尖二十个低代码平台&#xff01; 什么是低代码平台&#xff1f;2023年顶尖二十大低代码平台&#xff0c;哪个值得一试&#xff1f;低代码平台应该如何选择&#xff1f;本篇&#xff0c;我们将为大家盘点顶尖的十大低代码平…

React使报错不再白屏

如果代码中出现问题导致报错&#xff0c;通常会使页面报错&#xff0c;导致白屏 function Head() {// 此时模拟报错导致的白屏return <div>Head --- {content}</div> } export default () > {return (<><div>下面是标题</div><Head />…

Wpf 使用 Prism 实战开发Day07

待办事项页面设计 效果图: 一.布局设计 页面主要分上下布局&#xff0c;分2行进行设计&#xff0c;使用 Grid.RowDefinitions 将页面分上下2行 例如&#xff1a; <Grid.RowDefinitions><RowDefinition Height"auto"/><RowDefinition/> </Gri…

Stable Diffusion 系列教程 - 1 基础准备(针对新手)

使用SD有两种方式&#xff1a; 本地&#xff1a; 显卡要求&#xff1a;硬件环境推荐NVIDIA的具有8G显存的独立显卡&#xff0c;这个显存勉勉强强能摸到门槛。再往下的4G可能面临各种炸显存、炼丹失败、无法生成图片等各种问题。对于8G显存&#xff0c;1.0模型就不行&#xff0…

3.4_1 java自制小工具 - pdf批量转图片

相关链接 目录参考文章&#xff1a;pdf转图片(apache pdfbox)参考文章&#xff1a;GUI界面-awt参考文章&#xff1a;jar包转exe(exe4j)参考文章&#xff1a;IDEA导入GIT项目参考文章&#xff1a;IDEA中使用Gitee管理代码gitee项目链接&#xff1a;pdf_2_image网盘地址&#xf…

flutter开发实战-轮播Swiper更改Custom_layout样式中Widget层级

flutter开发实战-轮播Swiper更改Custom_layout样式中Widget层级 在之前的开发过程中&#xff0c;需要实现卡片轮播效果&#xff0c;但是卡片轮播需要中间大、两边小一些的效果&#xff0c;这里就使用到了Swiper。具体效果如视频所示 添加链接描述 这里需要的效果是中间大、两边…

仅仅通过提示词,GPT-4可以被引导成为多个领域的特定专家

The Power of Prompting&#xff1a;提示的力量&#xff0c;仅通过提示&#xff0c;GPT-4可以被引导成为多个领域的特定专家。微软研究院发布了一项研究&#xff0c;展示了在仅使用提策略的情况下让GPT 4在医学基准测试中表现得像一个专家。研究显示&#xff0c;GPT-4在相同的基…

依据小兔鲜项目,总结Javascript数组常用方法

find 在向购物车添加某种规格的商品时&#xff0c;查找购物车列表中是否已经存在该规格的商品 find()方法传入一个回调函数&#xff0c;代表对数组每一项item的校验要求 返回数组中第一个符合条件的元素的值&#xff0c;如果没有则返回undefined const item cartList.value…

【LeetCode热题100】【双指针】盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例…

Java架构师技术为业务赋能

目录 1 概论2 天猫的难言之隐3 如何拆解技术难点-三段论4 天猫线的破局之道-双引擎回归测试框架5 架构师的心理游戏-解决问题从转换思维开始6 技术助力业务的两个方向7 阿里新零售部门如何培养技术团队的业务知识8 如何围绕业务特点制定技术发展路线-阿里系和抖音案例9 阿里系业…

Ubuntu20.04安装ROS2

官方参考文章 Ubuntu (Debian) — ROS 2 Documentation: Foxy documentation curl密钥问题 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg curl: (7) Failed to connect to raw.githubus…

pytorch 模型量化quantization

pytorch 模型量化quantization 1.workflow1.1 PTQ1.2 QAT 2. demo2.1 构建resnet101_quantization模型2.2 PTQ2.3 QAT 参考文献 pytorch框架提供了三种量化方法&#xff0c;包括&#xff1a; Dynamic QuantizationPost-Training Static Quantization&#xff08;PTQ&#xff0…

wordpress安装之Linux解压缩安装

本次教程是为了让大家少走弯路&#xff0c;可以更直观的去认识我们不懂的知识面。 首先我们安装解压缩的软件 命令如下&#xff1a; yum install -y unzip 上一篇我们讲到传输文件了 这篇我们把传输过来的压缩包解压并进行安装。follow me&#xff01; 我们输入命令 unzi…

【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(五):Householder方法【理论到程序】

文章目录 一、Jacobi 旋转法二、Jacobi 过关法三、Householder 方法1. 旋转变换a. 旋转变换的选择b. 旋转变换的顺序 2. Householder矩阵&#xff08;Householder Matrix&#xff09;a. H矩阵的定义b. H变换的几何解释c. H变换的应用场景 3. H变换过程详解a. 过程介绍b. 细节解…

全面的.NET微信网页开发之JS-SDK使用步骤、配置信息和接口请求签名生成详解

JSSDK使用步骤 步骤一:绑定安全域名&#xff1a; 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 步骤二:引入JS文件&#xff1a; 在需要调用JS接口的页面引入如下JS文件&#xff0c;&#xff08;支持https&#xff09;&#xff1a;http://…

业务数据治理体系化实施流程学习总结

目录 一、业务数据治理实施流程 步骤 1&#xff1a;发现问题和制定目标 步骤 2&#xff1a;针对问题进行拆解&#xff0c;设计可衡量的指标 步骤 3&#xff1a;制定解决SOP和检查研发标准规范 步骤 4&#xff1a;推广运营&#xff0c;以拿结果为核心目标 步骤 5&#xff…

matlab科学计算

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

ARM架构安装RabbitMQ

1.查看centos内核版本 uname -a uname -r2.安装之前的准备工作 安装RabbitMQ必装Erlang(RabbitMQ官网添加链接描述) 2.1.Erlang简介 Erlang是一种通用的面向并发的编程语言&#xff0c;它由瑞典电信设备制造商爱立信所辖的CS-Lab开发&#xff0c;目的是创造一种可以应对…

【Java基础篇 | 面向对象】—— 聊聊什么是多态(下篇)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、动态绑定和静态绑…

C++ string类(2)—成员访问、插入、删除、替换、查找和交换操作

目录 一、成员访问 1、[ ]&at 2、front( )&back( ) 二、插入元素 三、删除元素 四、替换元素 五、查找元素 1、查找第一次出现位置 2 、在指定范围内查找 六、交换字符串 七、c_str 八、rfind&substr 一、成员访问 1、[ ]&at 虽然二者功能一样&…