调试器如何让程序暂停:从INT 3到时间旅行调试的技术解密
凌晨三点,生产环境的服务器突然崩溃。你启动GDB,attach到残留的core dump,输入bt命令,几行输出瞬间揭示了问题所在——一个空指针在函数调用链的第五层被解引用。在那一刻,调试器仿佛拥有了暂停时间的能力。但你是否想过,它究竟是如何做到的?让一个正在高速运转的程序瞬间静止,还能随意查看它的内存、寄存器,甚至回溯它的过去? ...
凌晨三点,生产环境的服务器突然崩溃。你启动GDB,attach到残留的core dump,输入bt命令,几行输出瞬间揭示了问题所在——一个空指针在函数调用链的第五层被解引用。在那一刻,调试器仿佛拥有了暂停时间的能力。但你是否想过,它究竟是如何做到的?让一个正在高速运转的程序瞬间静止,还能随意查看它的内存、寄存器,甚至回溯它的过去? ...
一个承载每秒百万级请求的消息队列系统,工程师在技术选型时毫不犹豫地选择了共享内存——因为大家都知道共享内存是最快的IPC机制。三个月后,生产环境出现诡异的数据竞争问题,调试了两周才发现是同步原语使用不当。最终不得不重构,改用消息队列,性能下降了30%,但系统终于稳定了。 ...
一段代码,在GCC下输出1 2,在Clang下输出2 1,在MSVC下又是另一种结果。这不是编译器的bug,而是C/C++语言规范有意为之的设计——或者说,是一个困扰了程序员三十多年的"特性"。 ...
2001年5月,Michal Zalewski在他的论文《Delivering Signals for Fun and Profit》中展示了一个令人不安的例子:一个看似完全正确的信号处理函数,仅仅因为在错误的时间点被调用,就能让整个进程陷入不可恢复的死锁状态。没有内存泄漏,没有竞态条件,没有缓冲区溢出——程序只是停在那里,永远不再响应。 ...
2015年,Julia Evans在工作中遇到了一个诡异的问题:向本地NSQ消息队列发布消息,每次请求都莫名其妙地多出40毫秒延迟。这是一个本地回环请求,理论上应该在1毫秒内完成。CPU负载正常,内存充足,没有任何明显的性能瓶颈。 ...
2008年5月13日,Debian项目发布了一份紧急安全公告。公告的核心内容令人不寒而栗:过去近两年间,Debian及其衍生发行版中OpenSSL生成的所有密钥,都可以被轻松预测。 ...
1992年12月,USENIX冬季会议上发表了一篇题为《The BSD Packet Filter: A New Architecture for User-level Packet Capture》的论文。作者Steven McCanne和Van Jacobson来自劳伦斯伯克利国家实验室,他们设计了一种新的内核架构用于网络数据包捕获。 ...