V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
fyooo
V2EX  ›  程序员

C++的多线程后台服务很容易 coredump 啊

  •  
  •   fyooo · 2018-12-24 15:52:57 +08:00 · 4397 次点击
    这是一个创建于 2190 天前的主题,其中的信息可能已经有所发展或是发生改变。
    接手维护一个老项目,容易 coredump 的主要原因还是我菜...
    27 条回复    2018-12-25 14:43:51 +08:00
    linbiaye
        1
    linbiaye  
       2018-12-24 15:58:19 +08:00
    那得看是你接手之前是不是容易 coredump
    keysona
        2
    keysona  
       2018-12-24 16:02:59 +08:00
    代码还原,看看初步怎样
    keysona
        3
    keysona  
       2018-12-24 16:03:15 +08:00
    初版
    araraloren
        4
    araraloren  
       2018-12-24 16:04:32 +08:00
    是代码菜 还是 你菜。。。
    chenqh
        5
    chenqh  
       2018-12-24 16:09:18 +08:00
    换 java,或者 golang,逃
    fyooo
        6
    fyooo  
    OP
       2018-12-24 16:09:20 +08:00
    @linbiaye 一直容易 coredump,我接手前也是每周 core 2 回的样子
    fyooo
        7
    fyooo  
    OP
       2018-12-24 16:09:42 +08:00
    @araraloren 毫无疑问是我菜...
    katsusan
        8
    katsusan  
       2018-12-24 16:23:53 +08:00
    根据这个"也"字,意思是接手后解决的 bug 数和衍生的 bug 数持平吗,根据我数年的维护经验,lz 应该是掉进坑里了:doge:
    truebaoge
        9
    truebaoge  
       2018-12-24 16:28:58 +08:00
    gdb 调试一下
    Earl
        10
    Earl  
       2018-12-24 16:53:26 +08:00
    lz 接了一个坑盘
    blless
        11
    blless  
       2018-12-24 16:56:08 +08:00 via Android
    小就重构,大的话…看钱多少
    dapang1221
        12
    dapang1221  
       2018-12-24 16:58:24 +08:00
    上 supervisor,自动重启,大家假装无事发生,还不是美滋滋
    NoAnyLove
        13
    NoAnyLove  
       2018-12-24 18:17:23 +08:00
    感觉上是没处理好多线程的同步 /临界区的问题,所以。。。。。。我觉得应该把菜加到标题里面
    littlewing
        14
    littlewing  
       2018-12-24 18:26:36 +08:00
    C++表示这锅我不背
    firebroo
        15
    firebroo  
       2018-12-24 18:40:31 +08:00
    写 c/c++我也经常 coredump。。。
    chenqh
        16
    chenqh  
       2018-12-24 18:41:52 +08:00
    还是单线程好,逃
    GeruzoniAnsasu
        17
    GeruzoniAnsasu  
       2018-12-24 22:37:54 +08:00 via Android   ❤️ 1
    拒绝写
    有全局对象的
    不封装 channel 或者共享内存的
    临界对象自己不带锁的
    敢于在构造函数之外的大括号内只放 new/malloc 或者析构以外只放 delete/free 的
    c++多线程程序

    一般这种不定期 core 又可能与 race 相关,哎想想就头大
    MeteorCat
        18
    MeteorCat  
       2018-12-24 22:38:56 +08:00 via Android
    我感觉楼主接盘侠了,恭喜恭喜
    0987363
        19
    0987363  
       2018-12-24 22:50:36 +08:00 via Android
    加 gdb 调呗,多半是临界区问题。。
    sinxccc
        20
    sinxccc  
       2018-12-25 00:21:21 +08:00
    容易复现的问题都不是问题…

    仔细看代码和 core,给关键部分写单元测试,总能看出来是哪儿的问题的。
    zts1993
        21
    zts1993  
       2018-12-25 00:55:27 +08:00
    C++ : 你们菜还赖我?
    congeec
        22
    congeec  
       2018-12-25 01:12:08 +08:00
    你菜或老项目写得烂或机器内存不够硬件背锅

    C++:反正这锅我不背
    sticnarf
        23
    sticnarf  
       2018-12-25 01:16:12 +08:00
    因为我菜所以喜欢 Rust 啊……
    aa514758835
        24
    aa514758835  
       2018-12-25 09:53:51 +08:00
    c++线程同步很是麻烦啊,需要考虑很多,解决方案也不少,锁、消息队列、互斥量、信号量等等,你可以看看 core 文件,段错误段在哪里~
    forcecharlie
        25
    forcecharlie  
       2018-12-25 10:16:23 +08:00
    注册 SIGTREM SIGSERV 然后在信号函数中使用 backtrace* 函数将堆栈展开输出到 bug 文件,然后使用 addr2line 去解析问题出在哪里,对于你的这种情况基本可以解决。

    我们公司的 sshd 服务器就是 C++ 编写,然后使用了 backtrace 功能,前阵子更新了 libssh 经常出现 结束连接 SIGSERV, 后来找到了是 libssh 的一个 bug。

    在信号回调函数中需要严格遵循异步信号安全的原则,不能有锁,否则会死锁,处理完后需要退出进程。(常见的动态内存申请需要加锁,因此不是异步信号安全的)。
    HackerPainter
        26
    HackerPainter  
       2018-12-25 10:36:21 +08:00
    不 coredump 的那就不叫 c++
    skadi
        27
    skadi  
       2018-12-25 14:43:51 +08:00
    我改造了好多有问题的 c++历史代码...还好他们之前知道使用有锁队列.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3839 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 05:07 · PVG 13:07 · LAX 21:07 · JFK 00:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.