• 请不要在回答技术问题时复制粘贴 AI 生成的内容
villivateur
1.57D
V2EX  ›  程序员

Debug 的时候又遇到这种灵异事件了

  •  
  •   villivateur · Mar 1, 2022 · 3970 views
    This topic created in 1549 days ago, the information mentioned may be changed or developed.

    CPP 写嵌入式代码,有个中等概率复现的 Bug ,在怀疑的地方写了行 printf 调试输出,Bug 便再也不复现。删掉调试输出,Bug 又出来了……

    16 replies    2022-03-02 16:10:03 +08:00
    Takashi123
        1
    Takashi123  
       Mar 1, 2022
    debug 版本合 release 版本不一样,还有内存越界这类如果破坏到堆栈了,可能加一行代码就结果不一样了。
    BeijingBaby
        2
    BeijingBaby  
       Mar 1, 2022   ❤️ 6
    printf 一个不可见字符 -> fixed
    villivateur
        3
    villivateur  
    OP
       Mar 1, 2022
    @Takashi123 一直都是 debug 版本,确实怀疑堆栈问题,但这东西太难查了
    darkengine
        4
    darkengine  
       Mar 1, 2022
    要是硬件时序问题,那就难搞了。。。
    nightwitch
        5
    nightwitch  
       Mar 1, 2022
    编译器版本高的话可以试试看能不能链上 AddressSantinizer ,专治内存疑难杂症
    anytk
        6
    anytk  
       Mar 1, 2022
    一般都是堆栈问题,仔细看一些调用地方,尤其是参数是数组的,我最近也被坑过一次
    hiliyg
        7
    hiliyg  
       Mar 1, 2022
    很正常,我司很多驱动也会这样,加的 log 多就没问题,log 一去掉,就不行,跟硬件响应时间,时序啥的有关系
    janxin
        8
    janxin  
       Mar 1, 2022
    @villivateur 一般这样子的 bug 确实很难查,于是我们就这么带了一个 printf
    duke807
        9
    duke807  
       Mar 1, 2022 via Android
    不知道是裸跑,還是小系統,還是 linux 用戶空間
    按照關鍵字查一遍:堆棧、越界、對齊、dma 、cache

    大多数人會選擇把問題藏起來,越藏日后越會遇到問題,就更加沒法查,只有選擇找到並解決根本問題才能真正成為高手

    嵌入式一般不建議用 c++,查底層問題會麻煩一些
    datadump
        10
    datadump  
       Mar 1, 2022
    strip 之前导出符号表,异常的时候把内存镜像转储
    datadump
        11
    datadump  
       Mar 1, 2022
    找到崩溃点,x86 是 esp ,arm 是 sp ,顺着栈里面找 callback 。开源的工具很多的
    cppc
        12
    cppc  
       Mar 1, 2022 via iPhone
    曾经在生产环境发生过程序崩溃问题,代码审查怎么也找不到可疑代码,崩溃转储出来的内存分析验尸也找不到导致问题的原因。

    最后实在没办法了跟甲方摊牌,对方同意直接在 debugger 里面跑程序,这才把 bug 给灭了
    respawn
        13
    respawn  
       Mar 1, 2022
    请贴码,无码言甚!
    ShiaoQuR
        14
    ShiaoQuR  
       Mar 2, 2022
    把要打印的变量 传递到全局变量 换个地方打印试试呢
    654656413245
        15
    654656413245  
       Mar 2, 2022 via iPhone
    可能是内存踩踏。
    添加的 print 语句可能刚好让指令或内存对象排布进入了一个调和状态,让漏洞无法再暴露
    wty
        16
    wty  
       Mar 2, 2022
    是不是别处修改了这个变量,然后因为没有 volatile 就默认不会变化,优化掉了,加了 print 打破了优化
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3207 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 61ms · UTC 12:25 · PVG 20:25 · LAX 05:25 · JFK 08:25
    ♥ Do have faith in what you're doing.