查看 error log:
我們拿到了崩潰位置0xee36f1,如何找到與之相對的代碼位置呢?
找臺測試機,獲取對應版本的安裝包:
解壓:
然後用 GDB 打開 mysqld:
在 0xee36f1 位置打壹個斷點:
我們可以看到,gdb 將崩潰位置的文件名和行號都打印出來,
剩下的事情,就可以交給開發工程師,按照這個崩潰堆棧來進行問題排查。
贈送章節
紅框內的這串信息是什麽?我們來解開看壹下,
這段信息分為兩段,"+0x71" 是壹個偏移量,前面是壹串文字,我們將文字解析出來:
可以看到前面這串文字是壹個函數簽名的編碼,用 c++filt 還原編碼以後,可以看到完整的函數簽名。
紅框內的這串信息的意思就是崩潰位置是 壹個函數起始位置 + 偏移量。
我們大概可以猜到,這個 MySQL 的缺陷是在為 binlog 產生新的文件名時發生的。
小貼士:
函數起始位置 + 偏移量 是壹種內存位置的表示方法,但該位置不壹定是這個函數內的代碼。
以本例來說,0xee36f1 這個位置,程序找到了就近的函數 generate_new_name 的起始位置,計算出有 0x71 這麽多偏移,就表示成了 generate_new_name+0x71 這種形式。
但 0xee36f1 這個位置的代碼,大概率是,但,不壹定是 generate_new_name 這個函數內部的壹段代碼。