- 主题:各位都解决过什么诡异或者让人有成就感的难题?
公司有个大牛是被收购进来的,给了估计上亿,后来老哥退休了。退休时,客户找来说,有个问题,设备的CF卡某一天的重要数据读不出。后来立了项目给我做。发现,CF卡里面FAT内容被文件的内容覆盖。同事找来另一个CF卡,是他去北方客户那里现场解决问题时从设备里拿出来的。发现该设备也是CF卡有该问题,疑似软件问题。客户说,如果1个月内不给个说法,将不再购买我司设备和服务,损失将达每年10亿以上。
看源码2个星期,因为没调试过该系统,所以先看源码。找到一个bug,该bug在SanDisk所使用的第三方(就是SanDisk买的代码)的FAT16库里面。该问题每隔一个半月左右发生一次,所以调试是很难等到这个问题的。汇报会上,客户非常满意,说这类似于大海捞针,或者在银河系里面捞一根针。公司给了我十多万奖金吧。
后来老哥又回来了。跟我说,这个事情可以吹一辈子牛了。所以,本人在这里吹个牛爽爽。
【 在 cestlavie 的大作中提到: 】
--
FROM 64.92.6.*
经验加上逻辑思维,加上运气吧。每天下班都在家编程序作为兴趣爱好,所以可以积累经验。尤其是多线程必须在实战中学习。
解决这个问题时先想到从各种多线程死锁,不可重入的函数的重入下手,结果最后啥都没发现。
再从共享变量入手,看看哪里用共享变量。因为想到多线程使用共享变量和可能会有问题。最终有个每毫秒更新的32位变量用来计时,在FAT16那个库里面,有个5个地方用了这个变量计算离上次操作是否间隔10秒。但是这五个比较分成两种写法: f - lastF <10, 和 f<lastF + 10。想想看哪个有问题。
这种错误是无法调试出来的,因为只在每49.7天出现一个10秒的窗口出错。只能用感觉。幸亏当时不会调试该设备,后来想到可以在日志中看出来是经过49.7天死机的。从开始追踪这个变量到做实验重复死机没成功到想到通过日志得出结论经过半天时间连续思考。所以现在可以在这里吹牛,否则就被解雇了。其实应该让编译器来定位这种错误了。现在Visual Studio会提示,你确定要用这个32位的计时器吗?每隔49.7天会溢出的。Windows98就是连续运行49.7天就死机。因为到了2^32毫秒。
【 在 lilnelse 的大作中提到: 】
: 厉害!
: 说说是咋找到的?这种不好复现的bug最难定位了
:
: ...................
--
FROM 64.92.6.*
老板,俺吹个牛爽爽都不行?老子辞职不干了。
再说一个,当年大学打仙剑奇侠传,走迷宫打怪吐血。还是DOS时代的。用debug直接调试,截获键盘中断,然后输出程序当前执行到的地址到文件,然后通过估算,调试,在1天内,将打怪取消,把屏幕的淡如淡出取消,遇到敌人后让敌人直接消失,打游戏变成了看电影。被室友用来泡妞用了。
【 在 teseract 的大作中提到: 】
: 你这个帖子老板一看到就立刻人肉出来了
:
--
FROM 64.92.6.*
大公司,大锅饭嘛。对我来说,收益还有简历上的内容,和未来吹牛的机会。
【 在 chunhui 的大作中提到: 】
: 避免了10亿的损失,才给10多万奖金。而且这种事不仅仅是避免损失的问题,还会巩固客户的关系。收益相当大。这老板太扣了。
--
FROM 64.92.6.*
那个大牛叫叔太显老,就叫他老哥
【 在 yijiyizhong 的大作中提到: 】
: 所以你是那个老哥或者大牛
:
: 【 在 bihai (new half life) 的大作中提到: 】
: ...................
--来自微水木3.5.1
--
FROM 174.194.197.*
对
【 在 fjtg 的大作中提到: 】
: "f - lastF <10, 和 f<lastF + 10。想想看哪个有问题。"
:
: 抱歉,我脑子笨,没有看明白。这两个不都是有问题的吗?
: ...................
--来自微水木3.5.1
--
FROM 174.194.197.*
当时自己写的内存驻留程序,截获键盘按键把此时的程序指针保存,并且保存按键。我一边打游戏,一遍按键,比如Insert, Delete,然后尽可能在遇到怪之前之后多按几次。主要是每次启动游戏都是这个同样的起始地址。然后观察,此时因为可以看到有效的程序地址,从那些保存的地址开始看反汇编。淡入淡出的调用比较好发现。先去掉。在打怪前和打怪后按键之间发现有几个子程序调用。改成跳过后,打怪就跳过了。
【 在 xeagle 的大作中提到: 】
: 厉害。只用dos的debug不借助其他汇编工具就把游戏的逻辑看懂了?
:
--
FROM 73.158.253.*
这个库是FAT-16,非常古老,是公司同事老哥90年代末买的,他认为一定是一个小年轻写的(90年代初左右)。那个时候,Windows没听说过可以连续几天不死机的,所以根本不在乎连续运行多久。而且老哥退休前修好了一个bug,之前这个设备是每过几天重启。
另外,我们在2013年左右有发现,CF卡当时2G大小已经脱销,主流是4/8G,还可以买到4G的。老哥设计的时候是2000年,那个时候一般32M。谁想到后来2016年4G都不卖了,只好上8G,但是只用4G。
【 在 lester98 的大作中提到: 】
: 这踏马的写库的人太不负责任了。。。
: 一般时间上的溢出我都会留出一百年的时间。。。
:
--
修改:bihai FROM 73.158.253.*
FROM 73.158.253.*