汽车的bug。
背景:我弟上高中,住校。
上学期某天弟弟把脚摔伤了,去医院检查后就直接回家休息了,书包也没来的及拿,然后周五我奉母上命下班路上去他们学校拿书包,拿完上车后就直接把书包放副驾驶座上了,在回家路上神奇的事情就发生了,车总时不时的发出一声“滴”的警告声,而且每次都是响一下,我一集中注意力观察仪表盘声音就没了,这特么咋回事呢。。。。
一边开车一边排查原因
1、老子系上安全带了啊
2、手刹也都放彻底了,而且手刹放不彻底时会一直响个不停仪表盘也会提示。
种种迹象表明报警声和上面这两条都没关系啊,到底咋回事呢,难道开了没两年的车电子系统就出问题了?感觉整个智商都被车侮辱了啊。。。。
然后我在还没到家的这段路程里,开始尝试让报警声复现,试图发现报警声的规律。在经过我不断的摸索尝试后终于发现了报警声出现的规律,聪明的你能猜到是咋回事吗?
规律就是一踩刹车车就响。。。。。这已经是很重要的一条线锁了,相信有些朋友看到这里应该发出会心的微笑了。。。。。
一切源于我弟书包的质量接近汽车识别乘车人的临界质量,我一踩刹车,书包减速,然后书包对副驾驶座位发生超重现象,超出汽车识别的临界质量,汽车检测到副驾驶有“人”没系安全带,所以报警,我一抬脚又恢复正常。
所以,这个故事教导我们。。。。。学好物理才能成为一名合格的老司机。。。。。
早年堆栈溢出 JMP ESP 就能执行的时候,我写过一个程序去找各种 JMP ESP 的同功地址。比如 MOV EAX, ESP/JMP EAX,也包括 CALL ESP。
然后在测试的时候发现,用 CALL ESP 写的攻击程序在某些机器上永远不能成功,而在另一些机器上百试百灵。最后发现影响因素是 CPU:在 AMD 的 CPU 上正常工作,换 Intel 的 CPU 就不行。
原来 Intel 的 CPU 有个 Bug:CALL ESP 也会和别的 CALL 指令一样,先把目标的下一条指令的地址压到堆栈里。也就是说,CALL ESP 指令永远不可能得到期望的结果。
还遇到过一批电脑,这批电脑中的任何一台,只要用 GCC 编译 OpenSSL 就会死机。
先后尝试过在 Windows 上用 MinGW 编译、在 Windows 上用 Cygwin 编译、在 Windows 上用虚拟机装 Linux 编译、格式化硬盘后直接装上 Linux 编译,全都会死机。而且具体编译到哪儿死机是没准的。
这个我猜问题也出在 CPU 上,但始终没搞清楚是什么 BUG。
前几天威锋网一位楼主发现了MacBook Pro不识别USB3.0的解决方法。
相信很多网友跟我有过同样的经历,就是买了rmbp,买了usb3.0的移动硬盘,结果接上之后却只能实现usb2.0的性能,这个问题困扰着我很久很久,也在网上查过很多资料,切换到虚拟机在切换回来啊,配置个usb hub啊,但始终没有彻底解决这个问题,知道刚刚一个无意的小动作让我找到了问题的原因,也彻底的解决了这个问题,跟果粉们分享一下。首先,仔细观察usb接口你会发现usb2.0里有四个触点,而usb3.0里有九个触点,还有五个触点在里面,而慢慢插入usb接口的时候应该是前四个触点先接触上,所以电脑自动识别成了usb2.0的接口,等完全插到底后系统已经认定是2.0了,接触上也没用了,所以,你只需要在插usb接口的时候速度快一点,迅速的插进去,ok,一切都解决了,同时接触上,查看系统信息,恩,5Gb每秒,是usb3.0的速度了,感觉天空都晴朗了,这也解释了为什么切换到虚拟机在切换回来就变成3.0了,因为切换回来时是接好的,九个触点都接触上了,所以系统识别为3.0了。
原文链接:
还好我买不起RMBP
这个问题没人邀请我,我要强行回答:
给某省做IPTV产品,内容服务器是某为的,它同时也提供我们的终端竞品。
在测试4K视频的时候,发现只要是我们的设备接上去,丢包非常严重,而某为的产品却是黄油般丝滑。
中间件没问题,都是ipanel的;ip层没问题,基于IPoE(其实就是DHCP),不跟PPPoE似的非内核态运行还会有瓶颈;硬件网卡和驱动没问题,博通这个还是值得信赖;ITMS应该也没有问题,甚至我们都照着某为把0 bootstrap抄了一遍…
各种调试,各种抓日志,各种改代码,懵逼了好多天,问题一直没法解决。
突然,一个同事有了个神来之笔的想法:要不抄一下MAC地址?于是,我们把自己设备的MAC烧成了某为的,问题竟然!!解决了!!!
最后诉诸于运营商,某为不淡不咸的表示他们那边做了个白名单,忘了对其它厂商的设备开放…
所以说,代码的BUG很好解决,加断点,加trace,加assert,打印堆栈,wireshark分析…很多手段,但人心的BUG,呵呵…
=================
2020年04月24日11:01:25,哇塞,怎么就突然365个赞了?
某为能崛起,对中国整体来说应该是好事;但他的崛起,对其它相关领域的中小企业来说,真的未必是好事。
不跟他们打交道很多年了,至少印象中,某为给人的感觉是傲慢,极其的傲慢,几乎无法沟通的那种。在与他们对接项目的时候,难受的要命。
而在行业中,比如说电网终端,他又是搅屎棍一样的存在,干了“相对小企业而言”不少缺德事,这个就没法说了,行内的人懂的应该会懂
某为承载了这一代国人在信息科技领域崛起的希望,尤其是现在,敌人越痛恨的,我们越应该表示支持。但真心希望,某为不忘初心,牢记“中华有为”,而不是“华而不实,为所欲为”。
再说回题目本身吧,接触过各种层面的软件开发,总体而言吧,嵌入式尤其是linux或者Android的嵌入式开发,调bug是最难受的,尤其是整机草稿完成,经常都不知道是哪个驱动又不兼容或崩溃了,断点也不好加,只能加 printk 才能维持的了生活的样子。。。。就是很气,^_^……——卧槽,我电瓶去哪了?
很多年前还在做学生时,遇到过一个奇葩bug
我们在做一个大型发动机测试设备,其中有两个毫无关联的东西。一个是油耗仪,一个是发动机冷却风机。油耗仪本质上是一个计数器,有燃油流过时输出脉冲到检测系统中;发动机冷却风机是变频器控制的,控制系统通过一个模拟量输出端口输出电压控制其转速。
我们把硬件全部连接完成,查完线,开始一点点测试。先单独测试风机,没问题,可以正常控制。然后测试别的,也都ok。测试到油耗仪时,出幺蛾子了。
为了测试油耗仪能否正常输出脉冲,我们拿个管子接到油耗仪上,然后吹口气,看看有脉冲没。吹了一口气,那个冷却风机转动了!我们以为是偶然的干扰,于是停下来不吹气,风机也停了。又试了几次,只要对着油耗仪吹气,风机就会立刻转起来,而且转的还挺快!
见了鬼了
开始查程序。怎么查,这两个部分都没有任何关联啊,又不是多复杂的逻辑。来回看来回查,折腾了一天,还是如此。
绝望中,开始看控制器的函数文档,发现奇葩了
当时用的是研华做的一个所谓的软核PLC,说白了就是个嵌入式的小计算机,直接用C/C++编程,类似于后来的arduino,然后可以像PLC一样组态各种IO模块,概念挺好,所以我们就当了小白鼠。
实际用起来才发现,研华开发软件的那帮哥们,简直就是一群。。。各种奇葩问题,客服啥都不懂,除了吵架厉害(我曾经因为他们的系统不稳定大吵一架,完败)
仔细检查接口函数代码后,发现错误原因了。
我们知道,C语言里面,除非特殊情况,void指针是应当严格禁止的,因为没有任何数据类型说明。但是这帮开发者为了偷懒,把所有函数的输入输出都用void指针。比方说
void inputXXX(void *data);
void outputXXX(void *data);
然后更为坑爹的是,不同函数内部又根据自己的需要,把指针强制转换为不同的类型,而且没有明确说明。因为工控领域中,ADC和DAC通常都不会超过14位,所以我们认为上面两个函数中,输入输出的data都是16位的短整型指针。测试inputXXX()函数也验证了这一点。但是!他喵的那个outputXXX()函数,竟然内部把data转换为了一个32位整形指针去使用!
我们的代码里,恰好是这样定义变量的:
ushort Wind; // 冷却风机转速
ushort Fuel; // 油耗仪流量
然后在油耗仪处理部分,我们调用
inputXXX(&Fuel);
从计数器里读油耗频率
在风机控制循环中,我们调用
outputXXX(&Wind);
但是,由于outputXXX()内部把输入指针看做是32位,于是就把Fuel当做了风速的高16位!于是只要对着油耗仪吹口气,风机就立刻跟着动起来。
从那以后我就再也不信任研华自己搞的什么软核PLC了
今天在写一个很简单的功能时,突然遇到了一个很奇怪的bug
没错,左侧边距不对劲,文字显示不全,明明什么都没写,却看着像负值的效果。
本人虽然不是很擅长调ui,但是这种简单的布局怎么也不可能出错。于是各种办法都试了试,xml来控制边距,java来控制边距,甚至都去看textview怎么ondraw的,一直也毫无进展…知道后来我撕下来手机的保护膜…
这大黑边,坑人呢。。。。
好多人都提到了seed的问题,实际上既然波形变得更差了显然两次随机的数据是不同的
如果我没记错的话,randn要保证两次随即数据一样是需要提前保存状态的,这位老兄显然没有采取这种操作
当然他还是成功毕业了的
/****************以下是原回答******************/
大学快毕业大家都忙着搞毕设的时候
有个哥们是用matlab做信号处理算法仿真的
他过来找我说:加上去的噪声去不掉了
我说:你要是能全去掉就能评个优秀毕设了
他又说:不是去噪去不掉,是程序里面去不掉
我就纳闷了
跟过去看看他的程序
当时应该是5月初了,正常人基本上都在收尾写论文了
我一看这家伙
刚把一阶低通滤波给做出来
我就有种不好的预感
看看他画的波形
呦呵,“去”了噪声的波形比没去噪声的还难看
看看他的程序
加噪波形数据(记不得叫啥了)=啥啥正弦波+randn(里面啥忘了,反正就是加个随机数当噪声)
挺low,但是没毛病
再看看去噪波形
去噪波形数据=加噪波形数据-randn(同上)
嗯,没毛病
……
…………
………………
……………………嗯?
有款软件叫pubwin,是网吧的一款收费软件,在广州清远等地区是ZF指定用软件,开网吧必须装。
这款软件上一个主要版本是PUBWIN2011,这个版本有两个恶心的BUG
1.服务端会释放一个sys驱动文件进系统里,禁止系统更改时间,只要系统开了机,系统的时间就更改不了,包括系统自带的时间更新服务。慢慢的,服务器时间就会比正确的时间慢几秒,再变成慢几分,客户机因为安装了网维大师,会自动同步时间,这样导致的一个问题就是,服务端和客户端时间不一致,按时计费客户会被提前下机,这样运行了几年也没有人发现,直到有个较真的客户跟收银员吵了起来,才发现服务器与客户机时间已经差了8分钟。然后怎么改都改不了服务器时间,咨询了厂家才知道,这功能关不掉,只能重启在bios里修改时间。
2.客户端开机会加载一个满屏的广告,广告格式是flash格式,广告通过网络下载开机后需要2-5秒时间才能加载出来。但是这个广告出来的时候,会让鼠标键盘失去焦点再获得焦点,这样导致的问题就是:(1)、客户开机; (2)、客户点击输入框输入身份证号;(3)、广告显示出来,鼠标键盘失去焦点;(4)、输入框获得焦点,继续输入。 这个过程中输入的身份证号码中间会被吃掉一两个数字,客户当然无法登陆。更恶心的是他无法登陆的时候提示并不是“用户名密码错误”,而是“禁止自助开户”,然后一堆人跑去前台问收银。
后来被顺网收购以后就更新了版本,现在好用多了。
---------------------分割------------------------------
又想起个事情,手机百度APP。
起因是有个前同事他发了个网页给我,这个网页在各种手机浏览器上测试都正常,惟独手机百度APP这个网页不能正常显示。这个前同事的页面又是投放了百度竞价,百度APP无法显示这个网页会浪费大量的预算。前端找了很久都找不出这个问题在那里。
我用手机浏览器测试过这个网页,果然跟我前同事描述的一致,就手机百度APP打开这个页面不正常,其它的手机浏览器全部正常。于是在开始在电脑上调试这个页面,调试了许久,发现电脑浏览器中删除某个JS文件能复现百度APP一样的问题,那问题就出在这个JS文件里了。经过反复的调试,终于明白问题在哪里了
手机百度APP有个广告屏蔽功能,默认是打开的,一般很少用户去关闭,网页的js文件里有一个重要函数名是 push_ad ,手机百度APP把这个JS函数当成广告函数禁止运行了。解决方法也很简单,改个名字就可以了,而且我告诉前同事以后JS函数名里最好不要包含ad这两个字符,问题就解决了。
-----------------分割-----------------------------------
可恶的电信劫持
有次同事发了个链接给我,这个链接里的页面有一定几率会跳转到一个陌生的网址上去,换过网络,浏览器,设备,电脑手机等都有一定几率跳转到陌生的网址上去。刚开始觉得是页面里有某些代码,我让前端仔仔细细排查了一遍后,确认没有任何的恶意代码。我把域名解析到另一个云服务商的服务器上去了,并且页面也更换成一个简单的页面,解析生效后我访问仍然有几率跳转到一个陌生的网址上去,这TM就很挑战我的智商了。
经过我几个小时仔细的排查,发现跳转代码是随机出现页面里的jquery.js文件里,而服务器上这个文件100%没有跳转代码,那只有一种可能,jquery.js这个文件经过中间商窜改,我中途换页面后仍然有jquery.js这个文件,所以仍然会被窜改。
很显然,能做到这个的只有电信运营商了,我把jquery.js这个文件换成了http://bootcdn.cn服务商提供的https链接,这个页面终于不再随机跳转到陌生链接了。
但好景不长,过了几天,这个链接的页面又跳转到陌生链接去了,这次我直接帮同事把整个域名都使用https访问,世界终于清静了。
有些朋友会存在怀疑,真的会有电信劫持吗?我只能告诉你,有些流量很贵,每一个点击价格都在3元以上,利益面前什么事情都不奇怪了。知名大公司很多都遇到过电信劫持,某鱼曾经还被电信劫持导致用户被诈骗(小心说话)。
本文绝对真实,有图为证。
大家能看出来这个Bug是怎么修复的吗?没错,就加了一个空格。
事情的起因是这样的,有一天,我厌倦了在VC++中编写代码,于是我决定将代码移植到VS2015中。在解决了各种问题后,有一个问题始终没有解决,那就是提示我某个变量没有定义。这么可能呢,明明啥都没改,并且那个变量就在我眼前显示着。
int neng; // 能 int why_am_i_not_defined; // Why?
不知道经过了多久的冥思苦想(毕竟年代久远),我终于有了一点头绪:那就是能
的编码有问题。在Shift-JIS编码(日文最常用的编码)中,能的编码是0x945c。5C
是啥,5C
在ASCII中就是反斜杠。所以上面的代码编译器看到的是这样的:
注:下面这个示例和上面的例子是我从同一个文件拷贝的,唯一的区别就是用不同的编码打开了文件。
int neng; // � int why_am_i_not_defined; // Why?
这个问题最坑的地方在于,在编辑器里显示的时候是完全正常的。你看到的和编译器看到的是不一样的。
这也告诉我们,不要在代码中放置非ASCII字符。并且在尽可能的情况下使用UTF-8。
本文使用 WPL/s 发布
最新的Java 9的大bug:
简单说,就是假如使用字符串的+=操作符,则+=左边的表达式会被执行两遍。因此例如这样的代码:
void doString(String[] array) { var i = 0; while (i < array.length) { array[i++] += "Hello World"; } }
就会出现神奇的结果。
就问你服不服。