V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Livid
V2EX  ›  程序员

在你写过的所有程序中,你曾经遇到过的最难调试的场景是?

  •  
  •   Livid · 2014-09-03 00:32:16 +08:00 · 6974 次点击
    这是一个创建于 3733 天前的主题,其中的信息可能已经有所发展或是发生改变。
    57 条回复    2014-09-04 01:15:17 +08:00
    geew
        1
    geew  
       2014-09-03 00:35:30 +08:00
    线上有问题 内网没部署.....产品不让线上直接调...
    gseven0312
        2
    gseven0312  
       2014-09-03 00:39:27 +08:00
    php调用java后台,没出现500错误,而且显示发送失败,最后抓包解决
    dong3580
        3
    dong3580  
       2014-09-03 00:40:27 +08:00
    程序完全是接口,不能直接运行调试,线上有问题没日志。本机测又没数据库,对线上的数据库没权限,领导有不给数据库权限,但是又要解决问题。
    jybox
        4
    jybox  
       2014-09-03 00:41:47 +08:00
    incompatible
        5
    incompatible  
       2014-09-03 01:05:24 +08:00
    多线程相关的问题通常比较难调试,比这更棘手的是在集群不同节点上的多线程的问题
    另外事务相关的问题也比较难以调试
    hehuozhao
        6
    hehuozhao  
       2014-09-03 01:23:54 +08:00
    OpenGL比较难Debug, 系统内部pipeline很难断点
    typcn
        7
    typcn  
       2014-09-03 01:31:44 +08:00
    电信抽风网断了,PHP 有 BUG,于是去网吧。用IE6 , 记事本 和 FlashFXP 写代码并实时上传到服务器上调试, 服务器也不敢开error_reporting , 看到输出不完整就说明网页有错误,然后修改。。。
    johnsneakers
        8
    johnsneakers  
       2014-09-03 01:33:45 +08:00
    @typcn 为啥不用error_log?
    typcn
        9
    typcn  
       2014-09-03 01:38:18 +08:00
    @johnsneakers 不是我的服务器。。没SSH访问权限 就个FTP 超蛋疼
    acros
        10
    acros  
       2014-09-03 02:01:39 +08:00 via iPad   ❤️ 3
    游戏,网络同步,极低重现率。
    打了大量log才确认出来。

    原上级主程超猛,debug最后发现微软的编译器在某个条件下link的代码有bug...那个bug比较特殊,最后他通过内存定位,直接改了微软sdk里面一个字节,问题就这样修掉了...
    em70
        11
    em70  
       2014-09-03 02:56:04 +08:00
    错误只要能重现,都好解决
    uestcldp
        12
    uestcldp  
       2014-09-03 07:19:23 +08:00 via Android
    刚工作时做一个外包项目,运维和服务器都在客户那边,更新版本是邮件传增量包和文档,由对方运维操作。每次线上操作甚至查个数据都要漫长的审批流程,而且对方运维很忙或者多一事不如少一事遇到问题首先要我们排查代码不配合定位。经常折腾了几圈最后发现是他忘了传包或者其它操作问题… #为什么外包害死人
    clino
        13
    clino  
       2014-09-03 07:33:26 +08:00 via Android
    不调试会出现,一用调试手段就完全表现正常的问题
    anheiyouxia
        14
    anheiyouxia  
       2014-09-03 07:47:55 +08:00 via Android
    第一份工作的时候要调试一个游戏bug,但是游戏应用有个线程锁处理机智,一个线程运行到一定时常会被强制终止,这个东西之前完全没人跟我说过,也加上没经验,每次调试到不同地方程序就直接被关闭了,当时好想把键盘砸了
    bbx
        15
    bbx  
       2014-09-03 07:50:23 +08:00
    hadoop job,运行一次5-6个小时。每改一点,就再运行一遍。。
    cdfmr
        16
    cdfmr  
       2014-09-03 08:25:50 +08:00
    最糟糕的场景是一次帮同事解决问题,MFC程序僵死,最终发现是一个跨越了N个文件十几个函数的死循环,并且中间有的环节并非函数调用,而是SendMessage消息。

    另外就是那些复现机率极低的问题。
    pythonee
        17
    pythonee  
       2014-09-03 08:28:55 +08:00
    内网多层虚拟机,系统是多个组件分布式部署在这多层虚拟化后的虚拟机上,而我需要远程联调这些系统,网络问题就能把能搞疯,当时采用了多层的端口转发
    MexiQQ
        18
    MexiQQ  
       2014-09-03 08:52:39 +08:00
    最难调试?莫过于抱着一堆别人的代码,还不在自己的机子上调试,然后屏幕非常小吧
    geodesy
        19
    geodesy  
       2014-09-03 09:42:55 +08:00
    segmentfault
    kokdemo
        20
    kokdemo  
       2014-09-03 09:49:14 +08:00
    调移动端的网页最痛苦了……

    一堆设备……
    XadillaX
        21
    XadillaX  
       2014-09-03 10:40:25 +08:00
    前几日搞 Storm,每隔三四个小时就会阻塞要重启——有时候要一天,也就是说等重现要那么久。
    gyteng
        22
    gyteng  
       2014-09-03 10:40:33 +08:00
    客户的机房不允许接互联网,每次更新一点东西,需要:
    1. 先QQ远程控制当地某负责人的电脑
    2. 从他的电脑登陆堡垒机(ie里面有个类似远程桌面的东西)
    3. 再从堡垒机里的putty登陆机房的服务器
    ……
    shyrock
        23
    shyrock  
       2014-09-03 10:43:24 +08:00
    @acros 我想说,类似的问题90%的可能是自己的代码调用错误,比如篡改了环境变量什么的,如果仔细梳理可以查到。当然,改SDK是可以绕过问题。
    davepkxxx
        24
    davepkxxx  
       2014-09-03 10:49:31 +08:00
    我以前的一家公司买了一个第三方的中间件,前台页面页、数据传输和校验都是根据配置自动生成,中间业务逻辑和数据存取需要自己写,后来因为扯皮导致对方不愿意再提供技术支持。使用这个中间件的代码不少地方也出现逻辑不清和结构混乱的地方,还有为了实现某些特定的功能而对该中间件进行了部分代码上的重写,导致的结果就是有些地方出了问题很难追踪,并且难以定位和解决。
    ahtsiu
        25
    ahtsiu  
       2014-09-03 11:15:25 +08:00   ❤️ 1
    想为运行在mipsel 的ddwrt 交叉编译一个nodejs,v8都编译成功运行了,nodejs 死活都是segmentfault,各种修改flags,怀疑uclibc 版本太低,又专门编译了一个uclibc 出来,,,,各种蛋疼,最后放弃
    signifox
        26
    signifox  
       2014-09-03 11:20:24 +08:00
    C++全异步处理+回调+异常处理
    efi
        27
    efi  
       2014-09-03 11:24:43 +08:00
    firmware与内核问题导致机器变砖。重现一次就是一个机器变砖。
    jamiesun
        28
    jamiesun  
       2014-09-03 11:25:10 +08:00
    “最难调试”我认为是一个伪命题。

    如果只是自己的软件范围,基本上不存在最难调试这种情况,假设碰到“最难调试”这种情况,更可能是其他非代码原因。

    和第三方系统对接时难的也不是接口代码问题,而是和第三方人员的交流问题,沟通不到位,互相踢皮球那才是让人抓狂的
    acros
        29
    acros  
       2014-09-03 11:34:20 +08:00
    @shyrock 不是。
    这个是Xbox360的XDK里面的BUG,微软确认过了,只是当时没发布修正,现在也不知道修正了没。
    leohxj
        30
    leohxj  
       2014-09-03 11:54:01 +08:00
    个人经历中,移动设备上原生浏览器的JS调试最麻烦,遇到问题的难调试。
    233
        31
    233  
       2014-09-03 12:20:30 +08:00   ❤️ 1
    嵌入式设备开发,连debugger没问题,正常运行有问题。而且因为没有fs,没法打log。
    不过也是开始没经验,解决方法是节约下来一个GPIO用来输出log。以后就都这么做了
    xylophone21
        32
    xylophone21  
       2014-09-03 12:35:03 +08:00
    没有人调过栈破坏问题吗?嵌入式里破坏瞬间没有错误报出来,错了就错了,继续往下走的那种.
    learnshare
        33
    learnshare  
       2014-09-03 12:51:01 +08:00
    客户说路由器不能上网~~~
    bombless
        34
    bombless  
       2014-09-03 12:55:49 +08:00
    最困难的还是SaaS提供者的生产环境和测试环境有显著的差异,有些问题还要线上调,真是囧死。
    samt42
        35
    samt42  
       2014-09-03 15:18:06 +08:00
    老板发现iphone客户端在3G环境下加载比较慢, 要求抓包调试一下...
    lehui99
        36
    lehui99  
       2014-09-03 15:21:42 +08:00
    刚开始熟悉一个新的系统,拿到一个bug:
    运行了一段script,显示20列10行的二进制数据,其中有一个数字错了(应该是0,但显示是1)。
    发现这个script并不是通用的script,而是用lex+yacc自定义的解释器。bug描述说是script本身的逻辑没错,错误应该在系统提供给script的api上或者在script的解释器上。
    在不理解script含义,不理解业务逻辑,不了解lex和yacc的情况下需要进行修复。
    lazyphp
        37
    lazyphp  
       2014-09-03 16:55:46 +08:00
    在本地调试一天,咦?我明明已经exit 中断语句了,怎么还在运行的?
    肯定是环境出问题。重新配置文件,迁移代码。
    发现问题有出来。继续折腾。
    离疯不远的时候,发现我填写的域名是 www.xxx.com
    艹,是外网的服务器!!
    Kymair
        38
    Kymair  
       2014-09-03 17:24:31 +08:00
    想起之前看Coders at Work, 几乎所有大牛的回答都是:Concurrency bugs.
    yqrm
        39
    yqrm  
       2014-09-03 17:32:00 +08:00
    IE6中英版不一致
    a2z
        40
    a2z  
       2014-09-03 17:40:55 +08:00 via iPhone
    改别人的rootkit,偶尔kernel panic
    wyj2046
        41
    wyj2046  
       2014-09-03 17:49:41 +08:00
    @acros 太耸人听闻了!
    cxxrocks
        42
    cxxrocks  
       2014-09-03 18:51:25 +08:00
    @signifox 我也遇到过,协程或状态机能大大缓解这种情况。
    myrual
        43
    myrual  
       2014-09-03 19:29:05 +08:00
    随便说一个最近写的一篇,非常简单的蓝牙无线通信的软硬结合的时候遇到的各种问题。
    http://blog.myrual.me/posts/223499-electronic-design-review

    这个项目demo5月份就做好了,到今天才把各种问题解决完毕,只有一次需求变化,几乎把蓝牙芯片的性能用到顶,
    这还不包括晶振选错,pcb封装选错造成的各种问题。
    sinxccc
        44
    sinxccc  
       2014-09-03 20:11:49 +08:00
    1. 没有必现条件,小概率复现的问题
    2. 涉及第三方的库,第三方不提供代码
    3. 新硬件,调试环境缺失
    4. 海量 log
    5. 没有 log

    1、2、3 都有,然后 4 和 5 里面任选一样的话,这个 bug 的解决就很依赖运气,还有公司有多重视了。

    虽然我一直挂在嘴边的话是“每个 bug 都有必然有一个原因”…
    fkue0487
        45
    fkue0487  
       2014-09-03 20:12:47 +08:00
    客户端一开,服务器CPU100%
    cbsw
        46
    cbsw  
       2014-09-03 20:22:57 +08:00
    对于中低端的 coder 来说,用的框架、编译器等非常底层或值得信赖的软件碰到一个还没被人发现的的 bug,好比物理中那些非常基本的原理存在问题时,通常都会怀疑是自己的问题,结果反复检查调试自己的代码直到真正非常确定是基本的东西出了问题,才会由衷地说一句艹,原来是这玩意儿的问题啊

    再现率低的 bug 对所有级别的程序员应该都是非常棘手难调的问题
    denghongcai
        47
    denghongcai  
       2014-09-03 20:25:12 +08:00
    @acros 吓哭了……
    denghongcai
        48
    denghongcai  
       2014-09-03 20:26:25 +08:00   ❤️ 1
    @ahtsiu node编译时--without-snapshot --without-ssl
    feefk
        49
    feefk  
       2014-09-03 22:28:41 +08:00
    刚毕业那会儿做嵌入式软件,我做ui,做的过程中发现我做的界面总是会莫名其妙的变成黑白色的。。对于这么严重的bug,老大限期我两天改好,那两天每天都是凌晨两三点回家,每天都是焦头烂额,怎么调试都发现不了问题。。。

    当时嵌入式设备上插着一个u盘,第三天查问题的时候,同事把u盘拔了。。拔了之后,奇迹出现了,我的界面再也不会变黑了。。。

    后来查找原因,发现是同事写的读取usb数据code会把系统的颜色表内存覆盖掉。。。现在想想都觉得当时那几天简直不能直视。。。
    FatGhosta
        50
    FatGhosta  
       2014-09-03 22:35:53 +08:00
    异步IO
    jptiancai
        51
    jptiancai  
       2014-09-03 22:43:16 +08:00
    电话调试,由于网络速度超盘,处于干着急的状态!!
    winiex
        52
    winiex  
       2014-09-03 22:57:12 +08:00
    不算是最难调试的一次,算是比较尴尬的一次:刚开始做扩展后端的机器集群来提供基础服务,二十多台机器组合在一起,但是因为对于运维没有深刻的经验所以没有很好地实现 fail over 机制。在一天晚上系统突然出现连接超时的情况,焦急中熬夜各种查询从数据库到 web server 的问题,最后发现是服务器提供商的一台运行数据库 slave 的机器宕机了,ping 不通,最后导致雪崩殃及到表层的 app server 处理速度,最后表现为大面积连接超时。
    lazywen
        53
    lazywen  
       2014-09-03 23:44:49 +08:00
    @signifox 头疼,硬着头皮上
    reorx
        54
    reorx  
       2014-09-04 00:36:03 +08:00
    这个问题之前在 quora 上看到过: http://www.quora.com/Software-Engineering/Whats-the-hardest-bug-youve-debugged ,答案 upvote 第一的哥们从业务代码一直向下追踪到了硬件的计时器才定位到 bug,令人佩服。

    就自己的经历而言,最难的一次是遇到 nginx 服务器大面积无规律重启的情况,无法人工复现,无法预期观测,只好各种 tcpdump 和 core dump,反复调试 kernel 的各种 TCP 配置,LVS 和 nginx 集群之间来回切换……最后查出来是 net.ipv4.tcp_congestion_control 使用 cubic 算法的 bug,在 SYN flood 的情况下会使 kernel 产生 divide error 导致系统重启,换成 reno 后终于解决了问题。
    Livid
        55
    Livid  
    MOD
    OP
       2014-09-04 00:37:14 +08:00 via iPhone   ❤️ 1
    @reorx 貌似你是在 CDN 公司工作?
    reorx
        56
    reorx  
       2014-09-04 00:49:45 +08:00
    @Livid 在 Wandoujia,接触过公司的一些 CDN 工作,不过主要还是做运维开发,上面描述的问题也是在 web 服务的 nginx 集群上发生的。Livid 应该还在 chinacache 吧?这才是货真价实的 CDN 公司呢,有机会向你请教 XD。(手抖不小心点到感谢了…)
    Cee
        57
    Cee  
       2014-09-04 01:15:17 +08:00
    寫多人協作遊戲的同步問題。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3306 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 00:05 · PVG 08:05 · LAX 16:05 · JFK 19:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.