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

时间:2022-10-31 13:35:10

       我们都知道,在嵌入式图形界面中使用最多的也就是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造成的!