在大多數系統上,您也可以從 gdb 啟動 mysqld,以便在 mysqld 當機時取得更多資訊。
在 Linux 上使用一些較舊的 gdb 版本時,如果您想要能夠偵錯 mysqld 執行緒,則必須使用 run --one-thread
。在這種情況下,一次只能有一個執行緒處於活動狀態。
在 gdb 下執行 mysqld 時,NPTL 執行緒(Linux 上的新執行緒程式庫)可能會造成問題。一些徵兆是
在這種情況下,您應該在啟動 gdb 之前,在 shell 中設定以下環境變數
LD_ASSUME_KERNEL=2.4.1
export LD_ASSUME_KERNEL
在 gdb 下執行 mysqld 時,您應該使用 --skip-stack-trace
停用堆疊追蹤,以便能夠在 gdb 內攔截區段錯誤。
使用 --gdb
選項啟動 mysqld,以安裝 SIGINT
的中斷處理程式(需要使用 ^C
停止 mysqld 以設定中斷點),並停用堆疊追蹤和核心檔案處理。
如果您一直進行大量新的連線,則在 gdb 下偵錯 MySQL 非常困難,因為 gdb 不會釋放舊執行緒的記憶體。您可以透過啟動 mysqld 並將 thread_cache_size
設定為等於 max_connections
+ 1 的值來避免此問題。在大多數情況下,僅使用 --thread_cache_size=5'
就很有幫助!
如果您想要在 Linux 上,當 mysqld 因 SIGSEGV 訊號而終止時取得核心傾印,您可以使用 --core-file
選項啟動 mysqld。此核心檔案可用於建立回溯,這可能有助於您找出 mysqld 終止的原因
$> gdb mysqld core
gdb> backtrace full
gdb> quit
請參閱第 B.3.3.3 節,「如果 MySQL 持續當機該怎麼辦」。
如果您在 Linux 上使用 gdb,您應該在您目前的目錄中安裝一個包含以下資訊的 .gdb
檔案。
set print sevenbit off
handle SIGUSR1 nostop noprint
handle SIGUSR2 nostop noprint
handle SIGWAITING nostop noprint
handle SIGLWP nostop noprint
handle SIGPIPE nostop
handle SIGALRM nostop
handle SIGHUP nostop
handle SIGTERM nostop noprint
這裡有一個如何除錯 mysqld 的範例。
$> gdb /usr/local/libexec/mysqld
gdb> run
...
backtrace full # Do this when mysqld crashes
請將上述輸出包含在錯誤報告中,您可以使用第 1.6 節「如何回報錯誤或問題」中的說明來提交錯誤報告。
如果 mysqld 掛起,您可以嘗試使用一些系統工具,例如 strace
或 /usr/proc/bin/pstack
來檢查 mysqld 掛起的位置。
strace /tmp/log libexec/mysqld
如果您正在使用 Perl DBI
介面,您可以使用 trace
方法或設定 DBI_TRACE
環境變數來開啟除錯資訊。