• 日常工作:一个死锁问题的查验


    问题说明:程序出现问题,上层业务检查后说,一个命令下去后,没有收到返回值,应该是阻塞导致的。查看了相关接口,发现该出有一个加锁的操作,可能是因为死锁导致的。

    问题查验:使用pstack+pid的方式,查看是否程序卡某处了。然后发现经常在同一个位置。

    Thread 154 (Thread 0x131c7b40 (LWP 23358)):
    #0  0xf5fc693e in g_malloc () from /lib/libglib-2.0.so.0
    #1  0xf7285c03 in CCodecWrapBuffer::CCodecWrapBuffer(long) () from /opt/mcu/mpu/lib/libcodecwrapper_x86.so
    #2  0xf7289b44 in CImageMergeWrapper::SetBufList(_GList*, int) () from /opt/mcu/mpu/lib/libcodecwrapper_x86.so
    #3  0xf7299a18 in MergeProcess(void*) () from /opt/mcu/mpu/lib/libcodecwrapper_x86.so
    #4  0xf5fe7f7a in g_thread_proxy () from /lib/libglib-2.0.so.0
    #5  0xf5f9101d in g_deprecated_thread_proxy () from /lib/libglib-2.0.so.0
    #6  0xf5f57b2c in start_thread () from /lib/libpthread.so.0
    #7  0xf5d2a77e in clone () from /lib/libc.so.6

    然后再查看此处(pstrace 23358),一直卡在里边,是在线程中使用了同一把锁,一直malloc失败导致一直占用着锁,导致其他线程拿不到锁,所以会产生上述阻塞的问题。

    那么为什么会malloc失败呢?

    top -p看一下,原来虚拟内存不足了(32位程序,4G内存,此时已经占用了3.7G)。

    是不是内存泄漏了 ?那问题可就大了,查看一下程序运行的时间。

    ps -p PID -o lstart,etime
    

     卧槽,已经运行了140多天,那内存泄漏也不好查了。

    目前的经验只能先杀了程序,重启一下。以后的策略,应该应对一下,如果程序一直跑着,则定期重启(如果占用CPU很低的情况下)。

    参考网站:

    https://www.cnblogs.com/shenlinken/p/8157204.html    排查程序死循环,死锁的方法

    http://blog.51cto.com/leomars/1888213        PS命令查看进程启动时间和运行时间

  • 相关阅读:
    Java-单机版的书店管理系统(练习设计模块和思想_系列 二 )
    HDOJ 1279 验证角谷猜想
    HDOJ 1266 Reverse Number(数字反向输出题)
    lucas定理
    CRT && exCRT模板
    exgcd模板
    洛谷P4774 屠龙勇士
    洛谷P1477 假面舞会
    洛谷P2704 炮兵阵地
    CF1080
  • 原文地址:https://www.cnblogs.com/whutao/p/10405113.html
Copyright © 2020-2023  润新知