关于QT中printf和Debug造成程序异常情况的说明

       我们都知道,在嵌入式图形界面中使用最多的也就是QT了。但在使用过程中可能会遇到各种各样问题,最近我就遇到一个问题。

想必printf和Debug都使用过很多次了吧。但是在QT界面里请慎用,还是直奔主题吧!

      我的开发环境是IMX287开发板。需要开发一个通讯控制程序。需要长时间运行。但我发现我的程序大约在运行8个小时左右界面就会卡死,奇怪的是看门狗却没有复位。当时以为自己的程序有问题。查了好几遍都没有找出原因。后来进过多次测试才发现原来是我程序中的printf导致的。

       IMX287默认带有一个图标启动程序,当我把我的程序做成图标程序启动时,发现过几个小时,程序界面就会卡死。当我用命令行启动时,程序跑了30多个小时还是正常的。相同的程序,不同的启动方式,造成不同的结果。唯一区别就是我在程序里加的printf语句在用命令行启动时打印在串口上了。

      用图标启动时串口就没有打印出任何东西。可能原因是printf在通过QT启动时,标准输出对应的应该是LCD,但是printf是无法直接在打印在ARM LCD上的。所以printf打印的内容一致驻留在linux的缓冲区内,当数据越来越多就会造成溢出。然后程序界面就会卡死。但是看门狗不复位。此时串口显示如下(前提是用图标启动前已通过串口登陆开发板,如果卡死后再通过串口登陆无法难道下面的打印信息):

 DMA: 66*4kB 0*8kB 1*16kB 1*32kB 2*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 440kB
 Normal: 8*4kB 1*8kB 1*16kB 0*32kB 1*64kB 1*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 760kB
 289 total pagecache pages
 0 pages in swap cache
 Swap cache stats: add 0, delete 0, find 0/0
 Free swap  = 0kB
 Total swap = 0kB
 16384 pages of RAM
 359 free pages
 1486 reserved pages
 875 slab pages
 150 pages shared
 0 pages swap cached
 Out of memory: kill process 2171 (start_zylaunche) score 795 or a child
 Killed process 2193 (framework) vsz:97360kB, anon-rss:49908kB, file-rss:556kB 

      根据提示可以看出是内存什么的不够了啊,而且也kill掉start_zylaunche和framework两个进程了,所以卡死后通过ps命令发现那两个进程都没有了(正常情况下是有的)。

      用命令行启动程序时printf通过标准输出打印到串口上了,所以数据就不会驻留在内存里。图标启动大家可以理解为没有把数据拿走,负荷太重就崩溃了。而命令行启动数据被通过串口输出了。

      为了进一步验证我的猜想,我把复杂的通讯功能都去掉了,只留一个界面和一个打印线程。通过图标启动一两分钟就卡死。通过命令行就正常。


  以上就是我的测试,我是在IMX287上测试的。其他的平台并未测试过。

  总结:万一你的QT程序过一会界面卡死了。可能使你程序里printf造成的! 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王涛的专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值