
s2: 活捉Bug
涛歌依旧
毕业后就职于华为和腾讯
展开
-
大学生读者让我帮找二分查找的bug
优快云的私信太多了,我几乎没时间看。有位大学生读者加了我微信,让我帮找一个二分查找的bug. 其实,通常情况下,我是不接这种活的。找bug这事,没玩没了。其实说实话,二分查找这程序,还真的容易出错。为了检验自己这几年是否退化,我就花10分钟写了一下,自测OK:#include <iostream>using namespace std; int heheda(int a[], int n, int key){ int left = 0; int right .原创 2021-09-12 23:19:45 · 3102 阅读 · 8 评论 -
人间四月天,bug无处钻
你是人间的四月天笑响点亮了四面风轻灵在春的光艳中交舞着变一. 缘来缘起人间四月天,bug无处钻,让bug没有藏身之地。今天,我们来聊句柄泄漏的定位。部分朋友遇到性能问题时,束手无策。别担心,我们一起实践,不信你搞不定。另外,性能优化,也是区分初级工程师和高级工程师的标志之一。在面试的时候,经常会被问到如何做性能优化,那些只背诵过八股文考试题目的人,有可能歇菜。遇到性能瓶颈,该如何去优化呢?本文用实战例子,带大家一起来查问题,干货满满,建议有兴趣的朋友,亲自试一下。不仅为笔试面原创 2021-08-14 12:37:35 · 729 阅读 · 0 评论 -
size_t和unsigned int傻傻不区分?
一. 前面的话上次洪哥跟我说,希望多写一些bug调试和踩坑经验的文章。没问题,反正我是挺会写bug的。在C++相关的开发中,有的朋友对一些基本的概念很模糊,用的时候也不注意,然后就呵呵哒了。我自己也偶尔有这样的问题,之前用C++写了一个程序,在测试环境自测无问题,上线后就跪了。二. bug程序为了便于叙述,我对原程序进行简化,如下:#include <iostream>using namespace std;string getCutRemark(const st原创 2021-08-14 12:31:54 · 1983 阅读 · 6 评论 -
六招制敌,搞定core dump问题
缘来缘起core的最原始含义是磁芯,是一种存储设备,dump的意思是倒出,那么core dump的含义就是:当进程发生异常时,会把当时的内存信息倾倒出来,形成core文件。每个做linux C++开发的人,必然会遇到过core dump问题。在C++相关的面试中,core dump的调试,几乎是一个必考的考点,旨在检验应聘者的实战调试经验。我知道的一个真实案例是:面试官让应聘者现场写出一个core dump程序,结果应聘者很懵圈,不知道怎么写。这说明,应聘者没有相关的调试经历,何谈通过面试?原创 2021-08-14 12:27:06 · 3549 阅读 · 0 评论 -
秒杀STL core dump概率问题
一. 缘来缘起之前,一同事开发的代码上线后,概率性出现core dump问题,查了几小时没有找出原因,也确实难以发现。我个人对查bug比较感兴趣,于是问了一下,他说是在vector的一个sort函数处出现了问题,百思不得其解。根据经验,我猜测可能是compare函数的实现有问题,然后让他做了小小的改动,果然,奇迹就这样发生了。二. core dump程序原场景较为复杂,为了便于叙述,我简化原场景,和大家一起学习下这个core dump问题#include <iostrea原创 2021-08-14 12:18:57 · 1531 阅读 · 0 评论 -
妙用xxd命令,节省0.5小时
一. 缘来缘起最近,同事遇到一个非常奇怪的问题,花了0.5小时,还没有头绪,而且,越想越奇怪。我刚好路过,感兴趣地问了一下,然后直接用一个xxd命令搞定问题,于是,皆大欢喜。二. 奇怪问题原问题相对复杂,为了便于叙述,我来简化一下问题。a.txt和b.txt文件内容如下:咦?这两个文件一模一样啊。但是,问题是,相同程序在读取它们时,出现了不同的结果。读取a.txt第一行,发现长度为3:#include <fstream>#include &l原创 2021-08-14 12:09:52 · 1874 阅读 · 0 评论 -
写给大学生新手的查杀bug方法
1947年9月9日,九九艳阳天,计算机历史上的第一个bug诞生了,我们之前在古今计算机发展简史(链接)中进行了比较详细的介绍。对于程序员来说,写bug、查bug、杀bug,都是司空见惯的事情。我博客和公众号的关注者中,有不少是大学生朋友。经常有人给我发一段程序,让我帮找bug在哪里。非工作日且有空的话,我一般会回复:打log调试。原创 2021-01-24 10:31:05 · 3947 阅读 · 13 评论 -
第一次遇到http code 413---上传文件太大被nginx拒绝
第一次遇到http code 413, 返回内容如下:<head><title>413 Request Entity Too Large</title></head><body><center><h1>413 Request Entity Too Large</h1></center><hr><center>nginx</center></body>经查,是上传文件太大,被nginx拒绝了。改nginx配置后,搞定。原创 2020-09-20 23:44:54 · 5456 阅读 · 3 评论 -
读从库导致的低概率bug
最近发现一个低概率问题: 现象: 金额丢失 原因: 代码流程控制出错,导致读取了从库的值,更改后,写入了主库。 而读取从库时,主从延迟太厉害,导致读取的值不是最新主库的值。产生更新覆盖丢失。 处理: 在涉及读后写的操作时,一定要从主库读。原创 2020-09-05 18:21:24 · 2888 阅读 · 5 评论 -
github.com/gogo/protobu: invalid pseudo-version: revision is shorter than canonical
编译执行go mod tidy时,出现了这个错误,挺恶心的: xxxrequiresgithub.com/micro/go-plugins@v1.3.0 requiresk8s.io/api@v0.0.0-20190726022912-69e1bce1dad5 requiresgithub.com/gogo/protobuf@v0.0.0-20190410021324-65acae22fc9: invalid pse...原创 2020-07-05 10:43:11 · 3778 阅读 · 5 评论 -
golang中的2006-01-02和ParseInLocation
看程序:package mainimport ( "fmt" "time")func main(){ timeFormatDay := "2006-01-02" nowTime := time.Now() endTime := nowTime yesterdayTime := nowTime.AddDate(0, 0, -1) beginTime, _ := time.ParseInLocation(timeFormatD...原创 2020-07-05 10:41:53 · 11098 阅读 · 2 评论 -
mac下的/etc/bash_profile不执行的问题
最近入手一台新mac, 在设置环境时,发现~/.bashrc不执行,然后发现/etc/profile也不执行, 真是大写的尴尬。 原因: zsh和bash有别, zsh不执行上述脚本,需要改为bash后,才执行。 至于zsh和bash之间的相互切换,网上一搜一大推,故不赘述。...原创 2020-07-05 10:41:29 · 2287 阅读 · 2 评论 -
dial tcp: lookup xxx.com on 8.8.8.8:53: no such host
最近在执行go mod tidy更新依赖库时遇到如下问题: dial tcp: lookup xxx.com on 8.8.8.8:53: no such host 但我的mac明明没有任何地方配置8.8.8.8啊, 而且我抓包看了,mac确实没有给8.8.8.8发任何请求。 继续仔细分析,看到这个提示: reading https://sum.golang.org/lookup/xxx.com 就是这里了,原来是这里在向8.8.8...原创 2020-07-05 10:42:17 · 57459 阅读 · 10 评论 -
golang中多写了个冒号,差点就呵呵哒了
实际项目中,出现了很低级的错误:package mainimport ( "fmt")var a intfunc init() { a := 10 // 这里手误,多了冒号,呵呵哒 fmt.Println("init, a=", a)}func main() { fmt.Println(a)} 差点就呵呵哒了。...原创 2020-06-06 20:41:42 · 2857 阅读 · 2 评论 -
从最近三个实际问题来看tcpdump抓包
在实际开发中,我们经常会遇到一些疑难问题。以网络的客户端和服务端为例,经常出现客户端和服务端的现象矛盾,导致僵持不下,怎么确认和处理这类问题呢? 之前碰到过很多类似问题,最后直接用tcpdump抓包解决。原创 2020-05-16 19:46:53 · 3267 阅读 · 3 评论 -
mac上的sed: invalid command code .
sed用得很熟,但在mac上执行出错,奇怪:~/hehe$ sed -i "s/taojie/taoge/g" `grep -rl taojie .` sed: 1: "./test.txt": invalid command code .~/hehe$ ~/hehe$ ~/hehe$ sed -i "" "s/taojie/taoge/g" `grep -rl taojie .`~/hehe$ ~/hehe$ ~/hehe$ cat test.txt ta...原创 2020-06-06 20:42:08 · 3796 阅读 · 1 评论 -
超时呵呵哒
逻辑:业务服务--->etcd服务,从而获取分布式锁 搞事:有人在etcd服务上跑任务,把CPU差点撑满 结果:业务服务有毛刺,获取锁超时,频繁报错 呵呵哒。原创 2020-05-10 22:50:44 · 2172 阅读 · 7 评论 -
go panic问题一例
写个工具,发现程序panic了:panic: runtime error: invalid memory address or nil pointer dereference[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x115dab8]goroutine 1 [running]:crypto/r...原创 2020-04-11 19:34:14 · 2449 阅读 · 2 评论 -
同步log比异步log的性能更好?
最近,有个接口有性能问题。意外发下,把异步log换为同步log之后,性能明显好转。 这有点搞笑呢。 后来发现,其实并不是同步log比异步log的性能更好,而是在换为同步log后,执行了重启操作,释放了累积的资源,导致性能变好。 呵呵哒,查问题就是这样,很多东西只是现象和表象,不是真正的原因。 不多说。...原创 2020-04-11 19:10:39 · 3533 阅读 · 2 评论 -
“网络问题“背的锅
服务A提供了一个接口: getXXX, 其中没有做任何操作,也没有打印log,收到请求后立即返回。 但是,调用服务A的接口getXXX发现,耗时偶尔比较严重。 开始以为是网络问题,后来发现不是网络问题,而是其它问题。 大家觉得有可能是什么原因呢? 欢迎讨论。 已经至少两次遇到类似问题了---资源泄露! 不多说。...原创 2020-04-11 18:46:34 · 2468 阅读 · 6 评论 -
一个疏忽引起的bug
来看建表语句:CREATE TABLE `xxx` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `user_id` bigint(20) unsigned NOT NULL DEFAULT 0, `clear_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:...原创 2020-04-11 17:45:37 · 2714 阅读 · 2 评论 -
go build main.go出现的呵呵哒错误
最近写个工具,main.go文件包名是main, b.go文件的包名也是main, main.go和b.go位于同一目录下,在编译的时候,我执行go build main.go, 结果报错: main.go找不到定义在b.go中的变量。 愣了一会儿才看出问题,呵呵哒,这是要用go build *.go来编译啊,大哥。 无语。...原创 2020-04-11 14:48:02 · 4647 阅读 · 5 评论 -
最近碰到概率性的http 403错误
最近,跟国外一个公司进行联调,需要调用他们的https接口,我在调试时发现,每次调用他们,都会概率性出现403错误,从直观上看,肯定就要找他们帮看具体原因了。 我问了一下对方,但他们非常不responsive,其实,只要他们看一下log或者返回403的逻辑,就很容易知道问题。没办法,只能我自己猜测并尝试。 考虑到他们的接口有IP白名单机制,所以我怀疑是...原创 2020-03-21 18:39:11 · 4220 阅读 · 5 评论 -
交叉编译后strip遇到的问题:can‘t process non-object and non-archive file
在mac上利用交叉编译,可生成在ubuntu上运行的文件。 然后,在mac上想strip时,发现失败:/Library/Developer/CommandLineTools/usr/bin/strip: can't process non-object and non-archive file 想了一下,大概知道原因了:在mac上的strip命令,不认知交叉编译后的文...原创 2020-03-21 18:15:53 · 2965 阅读 · 2 评论 -
如何查看tcp连接的建立时间?
在进行服务性能分析时,有时需要确认连接池、长连接、短连接相关的问题,需要查看tcp连接的建立时间? 怎么看? 1. 以如下tcp链接为例:ubuntu@VM-0-15-ubuntu:~$ netstat -nap | grep -i esta(Not all processes could be identified, non-owned process info...原创 2020-03-06 22:29:16 · 14876 阅读 · 10 评论 -
etcd锁释放超时导致的数据不一致性
服务端代码: func proc() { begin lock begin transaction amount := queryAmountFromDb() amount += req.OrderAmount setToDb(amount) end transaction // 正...原创 2019-11-09 21:24:10 · 3050 阅读 · 7 评论 -
异步log让人临时怀疑人生------log是现象,还可能是假象,不可全信
在之前的博文中,多次说过:log是现象,还可能是假象,不可全信。 在实际开发中,见过太多太多这样的案例。 来看看最近遇到的一个让人临时怀疑人生的问题, go伪代码如下:type Money struct { Principal int}func main(){ p := new(Money) p.Principal = 10 log.Infof("...原创 2019-11-01 20:59:26 · 3036 阅读 · 4 评论 -
tail -f a.txt | grep x | y 无法输出的问题------用行缓冲来搞定
最近同事反馈, tail -f + grep + awk时没有输出预期的内容, 我觉得奇怪, 试了一下, 果然没有输出。 第一感觉是:缓存, 缓冲, 又他娘是你。 因为我之前碰到过类似的问题《又是缓存惹的火------从tcpdump -iany port xxx -Xnlps0 | grep yyy | grep zzz 说起》:https://b...原创 2019-11-01 20:05:29 · 3581 阅读 · 3 评论 -
golang defer的那些坑爹事儿
先来一个最简单的:package main import ( "fmt") func f() { i := 1 fmt.Println("i1 is", i) defer fmt.Println("i2 is", i) defer fmt.Println("i3 is", i)}func main(...原创 2019-11-01 20:01:10 · 2473 阅读 · 3 评论 -
log丢失之谜
最近,遇到这样一个问题: a文件:func main(){ log.Infof("begin") y := sub(100, 20) log.Infof("end, y is %d", y) return} b文件:func sub(x, y int) int { log.Infof("sub begin") return x - ...原创 2020-03-06 22:31:43 · 2879 阅读 · 6 评论 -
异步log"丢失"之谜
前段时间,需要修复线上数据,于是写了类似这样一个程序:func main(){ for i := 0; i < 10000000; i++ { // fix users' data log.Infof("fix details") totalInfo += "xxx" } log.Infof("total info is %s",...原创 2020-03-06 22:32:59 · 2486 阅读 · 2 评论 -
mysql记录缺失之谜------要敢于怀疑一切
现象1:代码insert了一条mysql记录,并且有insert的log, 且有mysql给出的耗时, 但记录缺失。 现象2:百分之百没有业务逻辑会去删除这条重要记录。 现象3:人为不会用命令行去删除这条记录。 现象4:自增id在这条记录处缺失,不连续。 怀疑a: 是不是应用代码框架有问题? 导致没有insert成功? 显然跟现...原创 2019-10-25 20:50:18 · 3158 阅读 · 8 评论 -
最近碰到mysql覆盖写的低概率问题
最近碰到一个低概率问题: 10 加40 加60 预期结果是110, 但最终实际结果是50 单机单进程场景,来看下:func proc() { amount := queryAmountFromDb() begin lock begin transaction amount +=...原创 2019-10-18 22:52:11 · 2913 阅读 · 4 评论 -
PHP的exec()函数无返回值排查方法------借鉴本文方法后派上了用场,解决了问题
间接转载地址:http://blog.youkuaiyun.com/aoyoo111/article/details/21049759在安全imagemagic时 需要用到 exec很多服务器上安装失败exec()执行外部命令失败,但没有任何错误信息。 exec执行某命令在命令行下没有问题,但是在php中就出错。这个问题99.99%与权限有关,但是exec执行的命令转载 2016-02-29 23:58:51 · 11468 阅读 · 0 评论 -
log没有打出, rz -bye时提示core dump, scp上传文件失败, 今天是怎么了!!!------都是磁盘满了惹的火
开发调试的时候, 经常会遇到一些异常, 有的很棘手。 但如果每次尝试去解决问题, 积累多了, 总结多了, 自然就有能快速知道原因了, 这就是所谓的经验吧。 今天, 该打的log没有打出, log戛然而已, 我开始以为core dump呢, 但看进程号, 不是。 rz -bye上传文件, 提示core dump, 我擦! 然后用scp也原创 2017-03-04 23:22:06 · 8557 阅读 · 0 评论 -
运行程序出现Illegal instruction的定位和思考------又是printf string惹的火
最近写了一个程序, 运行的时候出现了Illegal instruction错误, 觉得非常纳闷, 而且该打印的log并没有打印出来。 当时并没有报core dump错误(因为我的机器的core开关没有打开), 经过一段时间排查, 发现是程序出了问题。 下面, 我们看看最简化的程序(简化后, 一眼就可以看出问题):#include using namespace std;int main(原创 2017-06-16 22:20:58 · 28536 阅读 · 2 评论 -
tcpdump抓包却抓到两个相同包的奇葩问题
去年, 在某次调测中, 用发包工具发包, 结果抓到两个包, 每次都是这样, 但log却显示只有一次。 这就纳闷了, 按道理说, tcpdump肯定比业务log更可信啊。 后来, 请教某哥, 原来他也遇到过这个问题, 权当是tcpdump在此特殊场景下的bug吧。 最近, 某GG又遇到了一次 就这样, 先说这么多。原创 2017-06-17 15:46:02 · 10463 阅读 · 1 评论 -
与namespace有关的两个编译错误
某次, 在大型的工程代码中, 我这样调用:#include using namespace std;namespace A{void fun(){ printf("aaa\n");}}namespace B{void fun(){ printf("bbb\n");}}int main(){ fun(); return 0;} 编译出原创 2017-06-17 15:14:56 · 8364 阅读 · 1 评论 -
API_INIT_XXX多次初始化导致后台服务成功率不高的bug的定位
最近前端同学反馈, 后台某服务的成功率不高, 我查了一下log, 发现很多错误发生在API_INIT_XXX中, 当时有点纳闷, 这个初始化函数是别的部门提供的, 所以就找赌赢的文档看了下, 发现文档上有备注: 这个初始化函数是进程级别的, 在每个进程中只初始化一次。 原来如此。 于是加了判断, 编译, 验证, 发布, 再check, 成功率就上来了。原创 2017-06-17 19:40:45 · 7230 阅读 · 0 评论 -
年轻人就是这样:地上有坨臭狗屎,不踩一下,不闻一下,就不相信那是臭狗屎(变量和函数可以同名吗?)
变量和函数可以同名吗?我的答案是:即使可以同名,也不可以让其同名。今天下午,定义了一个变量,与别人的函数名居然相同了,结果:结果不对,但是没有报错。改了之后,结果就对了,浪费我一个多小时。我晕。下次谁还说变量可以与函数同名,我就鄙视谁。装逼的人要说:其实,可以同名。我说:滚,别装逼! 写个小程序结束本文:#include void fun(){ printf("原创 2013-10-15 23:18:46 · 8092 阅读 · 1 评论