长期运行的 C 程序遇到 SIGSEGV 错误,如何定位错误发生的位置? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
learningman

长期运行的 C 程序遇到 SIGSEGV 错误,如何定位错误发生的位置?

  •  
  •   learningman
    Zxilly Dec 27, 2020 3792 views
    This topic created in 1950 days ago, the information mentioned may be changed or developed.
    写了一个程序,长期运行时会遇到 SIGSEGV 错误,但是不知道怎么定位错误位置
    现在是起了一个父进程观察到子进程挂掉就重启,硬抗。
    短时运行不报错,所以没法在开发机上用 gdb 跟踪,编译出来的程序在路由器上跑,同样没法追踪。
    有没有办法做到程序本身输出类似 Python 的 ErrorTrace 呢?
    代码在 https://github.com/Zxilly/UA2F/blob/master/src/ua2f.c
    15 replies    2020-12-28 09:49:00 +08:00
    AlohaV2
        1
    AlohaV2  
       Dec 27, 2020 via iPhone   1
    开启 coredump,还原现场
    lzr325
        2
    lzr325  
       Dec 27, 2020 via Android   2
    coredump,backtrace
    learningman
        3
    learningman  
    OP
       Dec 27, 2020
    @AlohaV2
    @lzr325 学到了,谢谢二位
    lewis89
        4
    lewis89  
       Dec 27, 2020
    @learningman #3 openwrt 上装个 gdb,哈哈 不过我路由器是 x86 内存 CPU 都很大,你如果是 mips 就难了
    lewis89
        5
    lewis89  
       Dec 27, 2020
    @learningman #3 用 VPN 吧 这么玩 太折腾人了,而且内核态切换到用户态 开销很大,搞了半天可能还是 VPN 好用
    lewis89
        6
    lewis89  
       Dec 27, 2020
    另外为啥不直接弄成 iptables 的内核模块,不过可能 debug 难度比应用态难度要大,应用态还能 coredump
    lewis89
        7
    lewis89  
       Dec 27, 2020
    给你 star 了 又了解了一个库 libnetfilter_queue 可以在应用态 定制规则过滤放行 packet
    zeroxia
        8
    zeroxia  
       Dec 27, 2020
    如果实在抓不到 coredump 。那么就拼命加 log 吧……
    Hconk
        9
    Hconk  
       Dec 27, 2020 via iPhone
    breakpad
    learningman
        10
    learningman  
    OP
       Dec 28, 2020
    @lewis89 内核模块崩了整个系统就 boom 了,这样比较安全
    流量不大,只需要清洗出方向流量,这个性能够用了
    no1xsyzy
        11
    no1xsyzy  
       Dec 28, 2020
    > 父进程观察到子进程挂掉就重启
    如果你用的是 systemd 的话就自动 coredump 了(
    bfdh
        12
    bfdh  
       Dec 28, 2020
    @lewis89 #4 mips 用 GDB 完全没问题,为经常这么干。
    wms
        13
    wms  
       Dec 28, 2020   1
    @learningman
    目前看有几个问题, pktb 分配后有好几个地方都直接 return 掉了, 没有释放, 会导致内存泄漏, 这样就会导致 str = malloc() 分配失败, 而 str 没有判断是否分配成功. 另外你可以编译的时候加上-g 标志,我看你段错误的地址是打印出来的, 可以用 addr2line 查看出错的地址. 还有调试内存错误的神器 -fsanitize=address, clang 和 gcc 4.8 以上都支持
    lewis89
        14
    lewis89  
       Dec 28, 2020
    @bfdh #12 空间小,125mb ROM 的小米 我都是省着在用,用 x86 之后 我直接在路由器上编译 调试代码了,因为内存跟 CPU 闲置太多了,即使是 J1900 编译 Openwrt 也绰绰有余了
    aneostart173
        15
    aneostart173  
       Dec 28, 2020
    我感觉这种情况八成是很小的内存泄漏,最后导致内存分配失败。
    About     Help     Advertise     Blog     API     FAQ     Solana     1569 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 51ms UTC 16:25 PVG 00:25 LAX 09:25 JFK 12:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86