.gitignore file looks simple. However, if I ask you the question:

What’s the difference between log/* and log/?

I bet most people cannot tell correctly.

I came across this question when I did a .gitignore file clean-up in my project. It took me a while to understand the difference and I find it super easy to be forgotten. After looking up the manual and doing experiments several times, I decide to write this post. Hope it can help those who think about this question as well.

上周碰到一个很有意思的问题,同事找我来跑一个node的程序,结果跑完了最后一个step,但是程序没有退出。

这对刚从同步编程世界转过来的同学来说简直是不可思议的事情。刚开始我也以为是程序的bug,如果不是bug的话有可能是在等待某个callback,但一直没有触发,同事也不明白是为什么,正好我刚入职就让我investigate一下。之前虽然写过一些node的程序,但是都是小打小弄,所以刚开始没什么头绪。

因为node没有什么特别好的debug工具(至少我不熟悉),黔驴技穷使出老办法,comment代码看效果。这个程序的特点是,程序本身比较简单,但是引用了一大堆的模块,所以我先确定程序本身不是造成hang住的原因,办法很简单,把有用的逻辑全部注释掉,结果发现程序什么都不干也会hang住。所以问题就在那些require的模块上了。接下来就是二分查找注释一部分模块看效果,然后递归查找,最后定位在两个模块上。发现这两个模块都调用了setInterval这个函数,恍然大悟原来timer会block main函数的退出。

那么作为一个码农,光知道表面原因是不够的,所以跟着就产生了三个问题:

  1. 为什么timer能block程序的退出?
  2. 除了timer,还有没有其他东西会block?比如我之前说到的callback(这个我是知道的,因为之前碰到过没有callback程序不退出的情况)。
  3. 如何方便地检测到block程序退出的原因?下次碰到同样的问题我可不想再二分查找了。