背景
Redis的代码质量一直被业内人士称赞,在极高的业务压力下也能有很好的稳定性。但是极端情况下,Redis也是有可能会Crash的。有时候因为种种原因,系统配置问题,磁盘空间写满了,进程权限不够等等,我们可能不会运气那么好,有一个core
文件可以拿去调试。这个时候,Redis提供了几种异常崩溃情况下的Crash Report
,很多时候我们基于Crash Report,再加上一定的分析就可以直接定位问题了。
Crash Report
在异常崩溃时,Redis会通过设置的signal handler
来生成Crash Report,目前Redis为生成Crash Report捕获的异常信号主要有以下几种:
- SIGSEGV
- SIGFPE
- SIGILL
- SIGBUS
这4种信号应该能包含大部分程序异常崩溃情况了,最常见的就是SIGSEGV段错误了,除0异常SIGFPE有时候也会遇到。
当Redis收到上面4种信号之一时,会在设置的sigsegvHandler()
函数中生成Crash Report,如下,
=== REDIS BUG REPORT START: Cut & paste starting from here ===
[19179] 12 Apr 18:47:42.599 # Redis 2.8.19 crashed by signal: 11
[19179] 12 Apr 18:47:42.599 # Failed assertion: <no assertion failed> (<no file>:0)
[19179] 12 Apr 18:47:42.599 # --- STACK TRACE
/home/dejun.xdj/kvs-kernel/src/libredi