hot__rain 2018-06-06 11:49 采纳率: 0%
浏览 2328
已结题

嵌入式linux 多线程卡死

在一台跑2.6内核的嵌入式linux设备上(可视对讲门口机),大概有十几个进程,其中自己的应用程序占用1个hicore进程,里面大概跑了四五十个线程,设备有gui界面、可以进行sip对讲、人脸识别等。
前几天碰到一个很奇怪的现象,在待机界面下或是进行蓝牙开门时(或是一些其他操作,总之没有规律)设备会卡死,期间界面动不了、键盘无响应。大概卡个10分钟左右自动恢复。。在卡住的时候发现cpu使用率还是正常待机时70%左右,但是现象是其他线程都不工作了,该打印的不打印,只有ls、top等系统命令是可以正常使用。
这个问题也是很难复现,几十台设备几天才会有1台出现,不知道如何排查。。

不知道大家有没有好的办法支支招,能有效缩小问题点范围?
设备还有8M剩余内存可在一台跑2.6内核的嵌入式linux设备上(可视对讲门口机),大概有十几个进程,其中自己的应用程序占用1个hicore进程,里面大概跑了四五十个线程,设备有gui界面、可以进行sip对讲、人脸识别等。
前几天碰到一个很奇怪的现象,在待机界面下或是进行蓝牙开门时(或是一些其他操作,总之没有规律)设备会卡死,期间界面动不了、键盘无响应。大概卡个10分钟左右自动恢复。。在卡住的时候发现cpu使用率还是正常待机时70%左右,但是现象是其他线程都不工作了,该打印的不打印,只有ls、top等系统命令是可以正常使用。
这个问题也是很难复现,几十台设备几天才会有1台出现,不知道如何排查。。

不知道大家有没有好的办法支支招,能有效缩小问题点范围?
设备还有8M剩余内存可用,跑GDB貌似也不够了用,跑GDB貌似也不够了

  • 写回答

3条回答 默认 最新

  • ehaozhuo9816 2018-06-06 11:55
    关注

    1、Aborted的问题,例如:

    ./logUtils0322

    [UnitTest.cpp]:will init log
    [cfgfile.cpp]: logfile open suc
    [LogUtils.cpp]:NOTICE OPen configue file SUC
    [LogUtils.cpp]:NOTICE suc OpenLogFile()
    [LogUtils.cpp]:NOTICE suc Log_Init()
    Aborted
    这个问题是由于访问内存错误造成的,例如一次时因为循环越界,导致访问界外内存时出现过此种问题。

    2、程序卡死的问题,就是程序的进程还在,但是却卡在那里什么都不做,该问题可能也是内存访问越界造成的;另外还可能是多线程中混合使用C和C++的函数 造成,例如:某些嵌入式linux平台对C++支持的不好,这时候如果在多线程中混合使用printf和cout,就会造成此问题

    3、segmentation fault的问题也是访问非法内存造成的。

    造成上述问题的主要原因就是内存操作引起的,因此在开发过程中,使用指针一定特别留心;
    1、申请指针变量时一定将其赋值为NULL;
    例如:
    Itest* pTest = NULL;
    pTest = GetInstance();

    2、使用指针之前一定先判断有效性;
    例如:
    if(NULL != pTest)
    pTest->Display();

    3、避免重复释放,在释放内存之前一定先判断是否已经为空;
    4、释放内存之后一定将指针赋值为NULL;
    例如:
    if(NULL != pTest)
    {
    delete pTest;
    pTest = NULL;
    }

    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大