刚看其他人的回答,又想起来一个。
现象:
很简单,有段时间学校宿舍电信的网络,经常大面积集体掉线,时间不固定,但发现最常掉线的时间是晚上10点多,各种投诉抱怨,问候学校网管家人的。(心塞呀,学校其实真的维护设备的都是我们这帮兼职的学生,那帮老师就管收钱和发钱,工资那么低,累成汪还被骂。。。)
调试:
白 天去看了下机房设备硬件一切正常,当时以为是认证服务器配置太low,晚上上线人太多就卡死,导致心跳包中断,集体被下线,后来发现发现虽然到5000多 人后会有部分心跳包没回应,但是客户端允许部分掉包,人再多也不至于丢包到集体下线,最后查log发现这台机架上的所有交换机到那个时候都会重启一下,于 是重点关注。
机房是5号宿舍楼1楼的一间宿舍改造的,加了空调,另外从配电箱里接了不限电的电源(宿舍的电嘛,晚上会断电,还有功率限制),联通电信移动每家一个宿舍做机房,于是我在机房里蹲守。
第一晚是周六,一晚无事。
第二晚,到10点多一点,咔嚓一下机架上所有交换机的灯一下全灭了,过了几秒后通电,重启。诶,我什么都没做呀,我就在机柜前坐着,也没人碰机柜呀!肿么就断电重启了,
然后又看了log,发现其他机柜切换到UPS电源供电了一小段时间,交换机的机柜是没UPS的,明显是断电了,但是我人在机房,没人碰设备呀
怀疑是插头接触不良,换了机柜里的排插。(其实想想就不太可能,接触不了还能定时发生?)
第三晚还这样,
第四夜还这样,
诶~神奇了,这是什么超自然现象?
难道是进户线有问题了?想起电线是从隔壁联通机房进来的。
于是跑联通的机房看看他们到点会有问题没?发现这边也是每到那个点,就自动切换到UPS供电。(联通给交换机也配置UPS了)怀疑是电路有问题,时不时断电。
于是,第五晚守在隔壁了。。。一夜无事!!!
诶??!!!这是神马情况?
然后就再也没事了,断电情况再也不出现了。。
足足好了1个月。直到下个月的运行商派人来例行检查了以下设备后,又出现上述问题了。
额,这是神马情况嘛!!
我去两个机房看了一下,诶,又好了,电信不掉线了!
抓狂了都!!完全是玄学呀这。
只要我进过联通的机房一次,电信的掉线问题就能解决。。
我居然还有防掉线的功能?
最后只好挨个问机房隔壁的几个宿舍有没有发现在那个点机房有没有奇怪的现象。
他们有人说感觉会掉线的日子里,机房不是那么吵!!
然后在我努力研究调查下,终于知道事情的真相:
========真相的分隔线==========
机房的供电是这样的,红色的是电线,紫色的是一排插座
电线是后改造的从室外的桥架上引入的明线,隔壁是电信的机房,因为进门的墙是承重墙巨厚还有钢筋,布线的时候为了省力,就只从联通这屋进了线,电线到插座高度后,打洞到隔壁。
联通机房隔壁宿舍的嫌睡觉时机架散热风扇太吵,就用偷偷用卡把门捅开(那种A级锁,很好撬的),睡前就偷偷把机柜的风扇电源拔了,早上再偷偷插上。。因为机 房有空调,拔了也没导致设备过热。但是。。。插机柜风扇的那个插座是进户第一个插座,就是那个孔的位置,他拔插时插头会带动插座,导致里边没接好的电线在 连接处断开一下。
为什么周五周六有时没事,因为他们可能周末集体出去了,晚上不在宿舍没人拔插头!
为什么是10点多,因为快睡觉了,才去拔插头。
为什么其他时间不定时,因为他们不一定什么时候想起来插回去。
为什么我进去一次就没事,因为我出机房后,会用钥匙反锁门,他们捅不开了,而其他人出来不反锁,只是关门,他们能捅开。
其实现在回想,最诡异的就是,我第一次蹲在联通机房的那一晚(第五晚)他没来撬门拔插头,不然也不至于追查这么久。
又想起来一个:
【关于锐捷和交换机的事】
学校某一天开始,大量用户正常上网情况下突然掉线,再次拨号时认证停顿在“寻找认证服务器”,之后提示框显示“认证失败”。但是有人发现锐捷认证失败后,“禁用”、“启用”网卡后,多次尝试锐捷拨号能够成功认证,但是在上网几分钟后会再次掉线。
锐捷的认证过程就不写了,看这个个问题的估计都大概知道。
先考虑,锐捷认证服务器故障,看了下,CPU占用率60%左右波动,内存占用2G左右。(这渣渣服务器啊。。占用这么高也是醉了)RG-SMP正常,加密狗也没问题。看来服务器没事。
那估计就是网络环境故障,看了下核心交换机到认证服务器之间的网,物理连接没问题,流量看起来也挺正常。
那估计就是核心交换机和用户终端交换机的问题。
然后发现,核心交换机到物理选课平台的服务器间最高峰时一秒快3万的封包。。。这肿么可能嘛,结果联系了那边,到服务器上一看,恩,服务器被人拿下了,被放了好几个成人和赌博网站在上边,还发现有挖流量矿的代码,还被拿来D别人,还被放了个SMTP服务器在发垃圾邮件。里边的学生个人信息被下载都不算事了。
断开与他们的链接后,CPU负载降低,但是认证还是失败。
继续查,发现另一个到行政楼的接口流量也很高,大约每秒1.5W的封包
show arp一下查看,发现一堆arp未完成报文,在Incomplete状态在IP地址无法找到其对应的MAC地址时进行转发,占用了交换机内缓存表。于是猜,要么中毒,要么出现环线,然后就查呀查,发现基础交换机上WLAN102、103流量异常,那就继续查呗,最后发现,某逗比做了这么一件事。
这个基础交换机是直接给这层供网的,大办公室留两个口,小办公室一个口,他们自己用交换机再分。
学校机构调整,部分办公室从新分配了,本来有个大办公室是,两个部门同时用的,他们每个部门自己各占用了一个接口用。后来换给另一个大部门了,他们搬家时,看到有两个接口,于是把这两个同时插到自己的集线器(居然连交换机都不是)上。
始作俑者还特肯定的和我说,这样可以加快网速,可以有双倍的带宽。
我和他说这样不行,他还不行,非说我不懂电脑了,他是在XX之家看到的,还说之前办公室里就这么接,就没事,网速还快了。(后来发现,他原来办公室其中一个接口,交换机端的插头松了,插了等于没插,网速什么的,只能说是心理作用了)
什么时候集线器能当路由器用了。。
什么时候,带负载均衡的双WAN口路由器,只卖20块钱了。。
想多玩多播起码你也要设置下吧,直接插有个毛用。。
不怕遇到小白用户,就怕遇到半懂不懂还装懂的。。
以前做windows技术支持,一直调试crash dump。就我个人的体验,有关线程安全的dump是最难调试的,来无影去无踪,看到的就是一坨已经被破坏的现场(dump),然后你需要在大脑中还原案发经过。
有一天香港某大公司(名字不透露了)上了一个case,他们自己的一个应用在生产环境中会莫名奇妙地crash。当时我就想:你自己应用crash找我们干什么,肯定是你自己代码问题,而你还不给我看你的代码!
所以几个难点:
第一,没有客户代码。
第二:客户用的系统是NT4!NT4什么概念?就是没有pdb文件的,符号文件只能对应到函数入口,对应不到具体的源代码行号。你只能把整个函数的汇编都读懂才能知道crash的地点是在做什么事。
第三:只有dump,不可能设断点调式,因为根本不知道如何重现。
反正就这么读了几百上千行的汇编(此处省略两千字),最后定位crash的地点,能看到进到EnterCriticalSection的api之后发现这个CRITICAL_SECTION结构其实已经坏了,然后就挂了。从heap结构可以看出似乎那个heap block已经被用作它用了,所以有可能那个CRITICAL_SECTION已经被delete了。
然后看谁管理这个CRITICAL_SECTION的, 发现是msvcrt,还是VC5的。好吧去找代码,还好那个代码是找得到的。然后就把所以处理这个CRITICAL_SECTION的代码全部找出来,把所有代码在不同线程中的不同执行顺序都排列出来,最后发现在某一个特殊的执行次序下会有一个race condition,导致这个CRITICAL_SECTION会被过早delete掉。还好一开始就怀疑是线程安全问题,入手方向没错。
好吧,最后居然是vc runtime的bug。当初错怪客户了。
调完这个bug的副作用就是之后看到汇编就想吐。看看现在c#的调试那根本不是事。
**************************************************************************************
2016.8.29 咋最近这么多赞,莫非来了很多考古学家?
既然这样,顺便发一个刚刚发生的真实案例,绝对真实,有血有肉!!(Debug 案例2发在原答案下方)
================================================================
原答案:(Debug 案例1)
======================================================================
差不多10年前,我们做了一个ARM核的芯片,据说还是国内第一批用ARM7做的,还挺高端,带有很多安全功能,当然安全就意味着难以调试,整个系统全部打散,不能分块。俺负责前端设计,系统,硬件软件驱动等杂七杂八一堆工作。
然后芯片流出来了,封装回来,几天几夜的调试,功能都正常了,那个高兴呀,第一个芯片就成功,奖金有了!
不过做稳定性测试时候有一个问题一直困扰着,这系统总是莫名其妙的有时候启动不起来,概率有个百分之几左右。上电就是不LOAD。而一旦起来之后,就很容易了。
反正功能设计,硬件,驱动都是俺的,那就调呗,软件,硬件,电路,仿真,研究了好几天,抓狂,无解。又整个系统不能分块,我都开始怀疑是不是ARM核的问题。。
又做了一个不断重启的测试系统,不断啪啪响上电断电,针对上电的情况作了统计。得出结论就是,上午不启动的概率高,下午不启动的概率低,晚上不启动的概率高,深夜不启动的概率低。。。。。和饥饿程度快挂钩了。。。
那时候那个抓狂啊,怀疑是什么干扰的,连屏蔽房,隔离电源啥都整出来了。就是没头绪,而公司给客户演示的时间快到了,要是现场挂掉就丢脸了,心里那个急啊。那段时间,每个深夜,公司里就是我座位上啪啪啪的声音------继电器的啪啪声。
接下来一个周日测试,公司空调坏了,汗流浃背,脾气极坏,几乎就要摔板子了。不过发现这天运气非常好,成功概率很高。没头绪,直接抽上烟,看着板子发呆,不知那根神经搭错,直接把烟头对着芯片戳上去!咱第一个亲生芯片!!如果不行了就掐死它!!!结果发现怪了,戳了烟头,启动哗哗的,每次都OK。遂怀疑是尼古丁过敏或者是温度原因。拿着烙铁烫着它,每次必成。于是送进高低温箱,做温度曲线测试,发现环境温度40度以上,成功概率极高,刚好碰见今天加班没空调,平均温度高,所以表现良好。而启动起来因为系统一发热,所以后面启动就容易了,温度一凉下来表现惨不忍睹,敢情这芯片是非洲来的。
有了方向就好说,先解决DEMO,给领导好看。遂做了一个电热丝发热电路,贴在芯片上,用单稳开关控制,一上电就加热,然后不断自动啪啪啪对芯片重启,一旦芯片重启成功了就断开发热电路和重启电路。进入正常运行情况。系统搭起来一测,效果杠杠的!!!基本都能保证几秒钟内就能启动,公司上下一片赞誉。 于是,领导拿着这套带着电炉丝的系统去做报告,销售拿着这个电炉丝Demo去给客户演示,取得极好成功,老板都在准备后续的销售计划了。俺心里急啊,总不能出货产品也带着电炉丝吧。。。。
静下心好好分析,和温度有关,又是随机故障,应该很可能是哪个地方悬空,存在不定态的问题,外面的电路是不可能了,前端模拟加入随机量也不能重现,那很大可能是后端的人搞的鬼,遂拉来后端人员(暂且称为C公司),检查扫描链和测试电路,果然发现有一个寄存器没有初始化复位。于是后面的情况就简单了,往扫描链中灌入一串数据,把未知量洗出来。成功!!!
所以我们第一代的产品,主芯片旁有一个奇怪的芯片。据线人报告,有竞争对手和盗版者都认为这是安全反盗版电路,因为拆掉这一块,系统工作就时不时的异常,抓不到规律,可能包含短时间正版验证,长时间正版验证,随机正版验证等高精尖反盗版措施。反正无法破解。。。。
俺笑而不语。图样图森破。:)
---------------------------------------------------
至于说为什么寄存器没有初始化复位没检查出来,我也不知道,这是人家C公司做的后端,他们的软件自己加进去的电路。而据说这C公司虽然牛,但那时候后端服务还是新的,软件也是新的,刚进国内,给我们一个特惠价做白老鼠。。。
=====================================================--
=
=(Debug 案例2)
=
=====================================================--
最近把家里的台式机搬到了客厅,虽然台式机和电视机都很少用了,但本着发挥余热的原则,接了一根HDMI线到电视机,于是可以双屏显示了,用奇艺投放视频到电视机中,一家人一起看,效果杠杠的,俺还可以在边上显示器上一边刷知乎,各得其乐。
不过呢,原来用的是天威宽带,看大网站的视频速度还行,因为天威有CDN. 但看不热门的网站,或者720p的节目,就相当的卡顿了。于是说服老婆大人,改为电信光纤,在沙发的地方放光纤猫, 因不好拉网线跨过整个客厅,于是用了一个TPLINK的多频无线路由器,通过5G WIFI连接电脑。这下载速度相当的满意。看视频也是可以选择最高清晰度的。不过呢最近都是下载蓝光大片,不看在线了,原因无他,爽。
这两天,LP大人想看一些新片,于是俺用奇艺找到电影,然后打开电视机,拉到电视机中播放。LP大人很满意。 可是蹊跷的事情发生了。无论是什么电影,只要放上去几分钟,马上就卡住,然后就不能放了,网络全断,PING 路由器也出现大量的掉包率。。。。然后再也不行了,浏览器也上不了了,切换其他视频也不行了。 重启电脑偶尔能连上,也是断断续续。 但是平时上网或者在显示器看视频,又是从来不出问题。
又有一天,不死心,打开浏览器,开始播放,然后暂停,然后等LP回来了投到电视准备一起看,结果看几分钟后就断网。。。
又有一天,LP大人自己找了视频,看了一段,然后暂停,准备一起看,结果投到了电视,过几分钟又断网了。。。
不过只用显示器看视频貌似没问题。。。。
每次只要LP大人想要看视频就看不成,看着领导败兴的样子,亚历山大。。。
于是查硬件,查软件,挪天线位置,切换2.4G, 5G, 似乎都没有反应。
查了网络上的信息,据说这个INTEL AC-7260 无线网卡似乎确实有网络兼容性问题,貌似我还真的是MSI主板:
这下中彩了,按照网上的信息修改设置也没用!据说最好的方法是换个网卡。于是向LP申请了2万块换一台一体机,未遂。
于是作为一个技术宅,摆了一个亮骚的机器,却无法让LP舒服的坐在沙发上看电影,俺多年来修理水龙头遥控器电灯泡积攒的权威性日渐消失。地位一天不如一天。。。
今晚不死心,又折腾了好久,重启电脑,路由器,拔掉所有外设。故障照旧。。。
现象总结:
1.用网线没问题。
2.只用电脑上网看视频没问题。
3.上网的时候家人看电视没问题。
4.把电脑的视频投上电视机,刚开始几分钟没问题,接下来就几乎连不上网了。然后再怎么重启,也很难连上,连上也是断断续续的。
(感觉就像家里有个幽灵,一看到我献殷勤,或者看到电视机被电脑占用就耍脾气。。。。莫非是贞子??)
突然,灵犀一动,仔细分析了坐着沙发看视频和趴在电脑前看网页的区别。发现这主要区别应该在于电视机的问题,于是开命令行一直PING路由器,同时切换电视机,发现只要电视机在显示PC内容,必然会断PING,关掉电视或者切换到别的源,就没有问题。看了应该是多屏或者输出的问题,试着修改HDMI分辨率,从720P60 改为1080P60,PING非常流畅! 问题顺利解决!!!俺又可以在家里当大爷啦!!
问题分析:
HDMI线有干扰,影响到了WIFI信道,加上这个AC7260无线网卡本身设计不良,容易串入干扰。由于HDMI工作频率是根据视频信号码率决定的,通过修改分辨率,改变HDMI工作频率,使干扰谐波信号跳开了2.4G和5G信道。另外通过HDMI传输信号会有一个接口协商初始化过程,只有电视机切换到这个HDMI源,完成初始化,才会在HDMI线上有数据,这点和VGA,YPBPR等模拟信号不同。
之前分析问题没有往HDMI方面想,主要是视频播放会有一个缓冲,因此,刚开电视切换到HDMI的时候,一切看起来是正常的(但此时后台网络已断),过了几分钟缓冲读完了才停顿。因此分析问题时很难和HDMI线联系上。
此问题其实做音视频类产品的项目经常遇见,由于HDMI频率高,传输长,因此很多输出源有意加重输出信号,导致EMI干扰严重,又由于很多HDMI线材质低劣,偷工减料,缺少屏蔽措施,因此HDMI接口往往成为电磁干扰的重灾区,也导致大量HDMI接口的兼容性问题(我这个破电视就挑信号源,有些1080P不显示)。因此能用YPBPR模拟线,或者能用DP接口,我都是躲开HDMI的。
****************************************************************************************
****************************************************************************************
****************************************************************************************
写一个热乎的,刚发生的:
写JS,自己手机没电了,拿同事老张的安卓机调试,很简单的获取用户微信昵称,结果死活获取不到,一直显示为null。应该是跨平台问题,因为之前在自己iPhone上是没有bug的,拼命看api文档,但是都没提到这方面。急死我了。
———————8.21更新—————————
刚刚老张告诉我他的昵称就是null。
答主的其他回答:
分享刚看到的一则新闻——
思科交换机复位键设计问题成了网络工程师最可怕的噩梦
2013年,思科针对旗下价格昂贵的3650和3850系列交换机发布了“问题通报”。世界各地的许多数据中心正在使用这2个系列的交换机。通报当中详述了这2个系列交换机当中复位键存在设计错误,导致用户插入网线之后,可能在短短几秒内让整个网络瘫痪。
如果有人在这个端口插上一根网线,在不知情的情况下就会按下复位键,他们甚至没有意识到整个网络已经因此瘫痪。
我说几个印象比较深的,都是“花好几天去调试,一行代码解决”的bug。
有和疑难杂症做过过斗争的筒子们都知道,解决一个困难bug,90%以上的时间都花在重现上。一旦这个问题能够重现,解决它就只是时间问题了。因此,你在绝大多数的issue tracker上报bug,对方都会要求你提供一个“可以重现问题的最小项目”,叫法有"reproducer", "minimum reproducible sample"等。
这个问题也不例外。2018年中秋节前夕我们的CI上总是时不时冒出一个莫名其妙的NoClassDefFoundError
,令人肥肠头疼。我们几个人花了很久都没能找到问题,直到有一天有人意识到这个问题和文件夹路径的长度是相关的——一般而言,你项目里测试能否跑成功和项目的位置是无关的——但是我们的问题只发生在项目文件夹路径是特定长度的时候。有了能够稳定复现的例子,我们很快发现问题并不在我们的项目里,而是在OpenJDK内部——如果jar包放在某个特定长度的文件夹里,OpenJDK会奇怪地抱怨找不到jar包中的类。随后,我们构造了一个重现的例子,给OpenJDK提了一个bug:
然后那一年的中秋我闲着无聊,就下载了一份OpenJDK的代码,花了大半天时间debug,发现OpenJDK在读Argument File的代码里有一个bug,简单来说,OpenJDK在读取Argument File时,每次读4096字节的数据到缓冲区中,在某种特定情况下,其内部处理转义字符的状态机的某个状态转换会出现问题,这种特定情况是什么呢?
答案是,两个连续的转义字符\被缓冲区分割开,即:
也就是说,我们非常不幸,遇到了大概1/4096的概率的问题……
找到问题之后,修复其实只用一行代码。这应该算是“画一个圈1美元,知道在哪里画圈9999美元”的故事的现实版了。
这个问题在JDK12中被修复了,不过因为没有backport到非LTS版本中,这个问题应该在JDK9/10中仍然存在。
另外一个是去年的,有人报告我们的软件(Gradle)在繁体中文的Windows上会丢出奇怪的异常(好吧又是Windows),随后更多的报告显示似乎这个问题存在于所有使用了CJK字符集的Windows上。因为我们的团队只有我一个人能看懂CJK字符集,这个任务自然而然落到了我的身上。
为了重现这个问题,我不得不去下载安装了一个繁体中文的Windows10,然后花了一点时间debug,发现有人在某次重构时,对jar进行transformation忘了设置UTF-8编码。一般而言这不是一个大问题,因为绝大多数jar包里的文件名都是ASCII的,但是坏就坏在Kotlin embedded compiler的jar包有个叫λ.class
的鬼东西……
找到问题之后,修复也是一行代码:
说到字符集问题,我想起了几个月前的一个bug,不算难调,但是挺有意思:我们的软件在土耳其语的环境中会出现奇怪错误,这是因为在土耳其语中,"i".toUpperCase()
的结果不是I
,而是İ
:
这个问题基本上是我用来当笑话看的放松贴,每次一看都会觉得很开心,想不到也会收到邀请^_^
那我也讲一个吧,话说大约2001年,我在调试一段自己写的约300行的Java。
你想啊,300行能写啥啊,每次大括号和注释还要换行... 尤其还是Java,不是Python的300行...
所以程序的核心就是一个类似水塘抽样的算法和几个数据类,但是我调试了整整一周,每天3-4个小时。
那时候真的是非常的崩溃啊,当时学校宿舍电脑是轮流着用的,本来宝贵的时间是和其他学校的同学约着一起玩mud的,但是因为这个事情挂着也没什么心思,于是轮到自己就呆在电脑前面反反复复的读这300行,每次都处心积虑地修改修改这边,修改修改那边,然后编译!输出错误。
到后来这段代码我几乎可以背下来了,然并卵。程序输出的结果一次次的无情的提示我,错误! 错误!错误!!
最后我怒了,直接把所有的代码全部注释掉,用println 直接输出应该正确的结果!总该对了吧。
还是错误……
然后发现了原因,我写了一个自动化的shell脚本来编译运行这个文件,在同一个目录下,我存了两个java文件,我一直在修改其中一个,但是编译运行的永远是另外一个,卒。
-----------------
有人可能会问我,为啥不到处println试试,我还真这么干了,在循环里面嵌套了println,自然不会显示出任何东西。但是这更加让我恐惧了,我以为发现了新bug,恍然大悟道,原来这个循环压根就没有执行,所以结果出错了!-_-bb
前一段时间写CPU的时候遇到过一个几乎是随机的bug…
背景是这样,我们写了一个双发射的MIPS32处理器,正在上面移植Linux。
最初的时候偶尔会出现这样的错误
或者这样的错误…
再比如这样的(看起来是内核栈坏掉了…?
我们最开始还没有太在意,因为它们出现的频率不高而且每次出现的地方都不一样也没办法调。
然而,在写完Framebuffer,调完VGA之后准备把显存dump出来存成图片(用的fbdump)的时候,这个bug的出现频率急剧升高,大概fbdump十次里面只有一次能够成功… 而且每次挂的表现都不一样。。。我看了一下之后问“能复现吗?” “很难” “没法调了…” 于是我们决定忽略它!fbdump偶尔成功出来东西就行!
大概过了一个星期,USB、Flash之类的都做好了,CPU也做了一些改动。突然某一天
这没法用了啊????马上要决赛了展示怎么办???调!
我说一下这FPGA是怎么调bug的,显然是不能挂一个gdb上去加断点了… 这挂的地方太随机也不能在kernel里面插print输出调试信息,剩下的方法就只有加ILA抓信号看波形。看到的大概都是这样的东西
而且电路你也没办法暂停它单步执行,只能写一个触发条件看前后比如1024个周期的波形。
最开始我们还是用几乎次次都挂的fbdump来调,我先观测了一下它们挂的表现,比较显著的几个是
这么多个不同的挂法… 我触发条件一次只能选一种,于是就随便选了一个感觉好调的。然而,每次挂之后kernel都panic了,都要reset整个板子,大概几分钟才能跑一次… 更加坑人的是,每次我想要抓一个挂法的时候,它一定会按照其它几种方法随机地挂,根本没法观测…
这中间我把ILA能够抓的周期数改成了4096,多抓一点是一点。于是大概一个晚上终于抓到了一次在__schedule的kernel panic!往回看。。。。。这个函数太长了4096根本找不到bug的源头… 而且已经不能再加大了因为板子资源不够了… 接下来只能换一个挂法抓信号了,于是我选了一个Reserved Instruction的异常来抓,结果还是一样的,没法观测到bug的源头…
没办法… 实在调不出来了,这时候大概是要去比赛的前几天,只能找一个挂的比较少的版本。
在一个下午,因为想到之前有一部分都挂在libc的内存分配里。于是我随手写了这样一段程序:分配一块内存,往里面填充一些东西(比如数组下标),之后读出来看看对不对。在分配的内存是1byte,8bytes,1KB,128KB,1MB的时候一点问题都没有,然而到了16MB,挂了!很神奇的是写进去之后读出来刚好有4个数不对!并且很稳定!
用ILA抓了之后看了一下,确实是从Cache读出来的内容就不对,但是有意思的是在这前后也有两次读相同数据的操作,它们读的结果居然是正确的!再仔细看,挂掉的4个地方都是两个连续的lw指令,对应的Cache Tag分别是:0x1b52fa/0x1352fa,0x2352fa/0x1352fa,0x3352fa/0x1352fa还有0x2b52fa/0x1352fa。前面一个对应的是数据,后面对应的是循环变量。看起来是Tag出现了一些问题?似乎是判断相等的时候高位没有用上?
好的… 对着代码看了一段时间发现了这样一个typo。。。(bug -1)
非常高兴地放到服务器综合,半个小时后上板,启动linux,fbdump,挂!
真没办法了… 不管了就这样吧… 算了还是再抢救一下,发挥想象力,感觉这种挂法大概是中断前后上下文切换出了问题?或者在某个不该中断的地方出现了中断?
于是这次决定抓一抓异常返回恢复现场的地方。抓了好几次之后,我随手又拉了几个信号放到波形图里,之后就发现了一个不可思议的地方:异常返回之前恢复现场的时候对内存的访问是uncached?不对啊… 地址明明是在kseg0并且config0对应的控制它是否cache的段也标记着它应该是通过cache访问。于是… 打开MMU的代码仔细看了一看,发现在某些很特殊的情况下会把通过cache的访存判定为uncached… 然后如果之前保存现场写入Cache的数据来不及写回就…… 改了一通之后再次综合,fbdump终于成功运行了!前后代码的修改不超过10行……
其实在这之前还有一个猜出来的bug,为了双发射实现简便我要求分支和延迟槽一起发射。为了实现精确异常,对于取指异常(例如TLB miss)的处理会在执行后进行,但是这时候实际上TLB还是能翻译出来地址的,而且通过Cache取出来的内容可能也是合法的(比如之前某个进程对应虚地址的数据)。这样就出现了一个有趣的情况,第一条分支指令没有TLB miss,第二条延迟槽TLB miss并且取指得到的内容对应一个分支指令。MIPS规范里延迟槽如果是分支那么处理器的行为是UNDEFINED,于是我就没有考虑这个情况。这造成的结果就是发射的时候延迟槽没有被发射(因为发射的时候如果第二条指令如果是分支那么不发射这条指令)。然后执行的时候会在这里进入异常处理,但是在延迟槽中进入的异常它的返回地址并不是自身,而是对应的分支!而这样没有一起发射就导致延迟槽没有被正确识别出来异常返回到自身,如果分支跳转了那么控制流就错了。
还有一些两三个小时就调出来的bug就不提了… 真的感觉这个调试完全依靠想象力和看脸。。当然我们是有testcase测CPU的,但是这种边界情况测试的时候似乎的确想不到。
顺便推销一下最后的结果:Github
有一说一,其实性价比最高的4K蓝光播放设备很可能是二手xbox
首先这是Fed一月 memo
先说结论:
FOMC 维持利率在 0-0.25% 不变。且确定 3 月完全停止 QE,同时 3 月加息也是箭在弦上,基本会后声明皆符合市场预期,没有太多的意外。
Powell 记者会确实是偏一点点的小鹰派,但我也认为,Powell 的说法不至于拉升市场加息预期至 5次 、并拉升缩表预期至上半年,反而比较像是在强化加息 4 次之预期。
另外我个人觉得,一些中文媒体似乎误读了Powell 记者会的部分片段,下面 Allen 再进一步说明。
1. 3 月加息停止 QE 早已定价
本次会议 Fed 再次确认 3 月将准备第一次加息,并同时停止 QE。
Fed 也再次重申,货币政策是要支持美国经济达到充分就业、与通膨长期均值维持 2.0% 的两大目标。
这部分我想市场早已定价,这裡完全不会是问题,所以我们不讨论太多。
2.未来加息在每次会议都可能发生 (?)
Powell 的原文说法是:Won't Rule Out Hike Every Meeting.
但我有看到部分中文媒体写:不排除每次会议都加息的可能性。
上述我想或许是误读了 (还是其实是我自己误会中文的意思 ?)
我的理解是:Powell 是说加息在未来每场会议都可能发生,指的是“不会在特定月份才加息”,不是说每场都要加息。
Powell 说得很合理,经济本来就是动态的,加息本就不会侷限在什麽月份才启动,端看当时的经济状况而定。
我认为Powell 上述说法,并未延展今年加息预期至五次或更多,若有这种想法,那绝对是误读了。
3.更大规模的缩表?
Powell 在记者会上提到,Fed 需要更大规模的缩表,但请大家不要恐慌,因为我又觉得部份中文媒体过度解读了。
我认为Powell 说到的“更大规模缩表”,在思维上指的是:
因为当前 Fed 资产负债表高达 8.9 万美元,这是新冠疫情爆发之前的两倍大,显然在绝对规模上是非常巨大的。
而上一轮 2017-2019 年 Fed 缩减资产负债表,是自 4.4 万亿美元缩到 3.7 万亿美元停止,缩表的幅度大概是 15.9%,共缩减了约 7000 亿美元。
确实每次缩表的经济背景绝对是不一样的,所以幅度也绝对不会相同,但我们随便抓,假设本轮缩表将缩减 10% 资产负债表规模,那麽这也要降低 8900 亿美元,规模当然很大。
但我认为,不需要过度恐慌在“更大规模缩表”这几个字上。更重要的,我认为是“Fed 缩表的速率是多少?”
我相信缩表没问题,缩表太快才是问题,因为缩表速度若太快,将直接影响的会是美债殖利率升速、以及殖利率曲线的斜率。
这点Powell 也非常清楚,Powell 在记者会上也不断强调,联准会内部尚未具体讨论到一切缩表的进度,要等到 3 月再说。
4.缩表比较可能落在下半年
Powell 在记者会上说明,希望在加息至少一次之后,再来开会讨论缩表的事情,且委员会至少将讨论一次,才会做最终拍板。
更重要的,Powell 希望缩表的进程是有秩序的、是可被预见的过程。
从上述Powell 丢出的时间表看,我个人认为缩表将落在 2022 下半年,最快可能是 6 月份,因为在 3 月加息后,Fed 才会来讨论缩表。
我个人相信 Fed 现在内部早已在讨论缩表,但委员会显然尚未准备好来与市场沟通缩表的前瞻指引。
而缩表这麽大的事情,我个人认为 Fed 需要起次跟市场沟通 2 次,并把缩表规划说得非常清楚之后,才会开始进行,所以比较合理的缩表时间,估计将会落在下半年。
5.最大风险:高通膨
Powell 在记者会上,大概提到了 800 万次的“高通膨压力”,并认为目前美国通膨风险仍在上升阶段,但预计 2022 通膨还是会回落。
Powell 说明,目前美国通膨居高不下,主要仍是供应链所致,白话来说就是供需仍然失衡,且供给侧 (Supply Side) 改善的速度是低于预期。
Powell 强调,目前美国高通膨持续存在,而美国经济要的是长期扩张,所以若要长期扩张,物价势必需要保持稳定。
这边开始进入正题了,我认为这是本次会议的最重要核心,是让我体感上,觉得 Fed 鹰派的地方。我认为 Fed 承认自己落后给菲利浦曲线 (Behind the curve),简单而言,Fed 这次的加息速度大幅落后给通膨。
由于 Fed 在 2021 年对于通膨的误判,先前 Fed 在 2021 年认为通膨在年底就可望自然回落,但也就是因为这件事没有发生,反而通膨还更为严重,所以目前才有使用加息来追赶通膨的压力。但当前宏观环境看,通膨的压力是来自于缺工、供应链紧俏等问题,再加上拜登政府的大力推行财政刺激在那边推波助澜~
所以这一次的通膨是来自于实体经济上的供需失衡问题,并不是金融市场过度投机、企业超额投资等问题,我认为 Fed 在这次的通膨问题上,能做得空间非常有限。
这裡将产生一个不确定性的较大风险,就是 Fed 只能靠货币紧缩去压通膨预期,但实体经济的根本性通膨问题,还是没有获得解决。变成最终 Fed 只能再用更剧烈的紧缩政策,去引导通膨预期走低后,尝试来压低实际通膨率,所以这裡将让 Fed 的紧缩路径,存在著较大不确定性。
比较好的处理方式,应该是直接去解决实体经济上的缺工和供应链/例如我之前提到的塞港问题,让实际通膨率自己走低、而不是靠 Fed 挤压通膨预期之后去引导。
谁可以去把坐在白宫裡疑似患有阿兹海默的白髮老头一巴掌打醒...还我特~
结论:我个人认为 Fed 今年将加息四次,不至于加息五次,而加息四次之预期,相信市场应该已经定价;至于缩表,相信市场尚未定价,估计将落在 2022 下半年,最快可能是 6 月。
如果 Fed 今年加息五次,我会感到非常意外,因为这意味著 Fed 很可能在 2023 年底、2024 年初,就因为美国经济放缓太快而需要降息,Fed 这波操作就会变得非常韭。
最后说说股市的想法目前 Nasdaq 已经插水一段时日,抑制通胀是当务之急,而股市所谓修正才多久已出现V转。对通胀而言意义不大,修正数月才可能有帮助~所以我之前一直描述为“恐慌”。因此对白髮老头而言,怎麽做才有利于中期选举就很清晰了。
最好还是坚持认为市场或已定价加息四次之预期,但缩表预期则是尚未定价的观点。
配置上美股我倾向持有科技权值股,一些 Megacap 的估值我认为合理、前景确定性较高,而这样也可以让你的收益贴著 QQQ 走。
考虑到一堆成长股腰斩,我也愿意加仓接刀成长股,但建议佔据投资组合的比例,或许不要超过 15%,如果选股功力不错,这裡就会开始让你的收益拉开与 QQQ 之类的差距。
最后,我相信人人都会想在市场下跌的环境裡接刀,接刀不是不行,但若接刀失败,斩缆我建议速度要快,我个人不考虑价投的话一次斩缆的比例都是 50% 以上。