文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  在 gdb 下除錯 mysqld

7.9.1.4 在 gdb 下除錯 mysqld

在大多數系統上,您也可以從 gdb 啟動 mysqld,以便在 mysqld 當機時取得更多資訊。

在 Linux 上使用一些較舊的 gdb 版本時,如果您想要能夠除錯 mysqld 執行緒,則必須使用 run --one-thread。在這種情況下,您一次只能有一個執行緒處於作用中狀態。

gdb 下執行 mysqld 時,NPTL 執行緒 (Linux 上的新執行緒程式庫) 可能會導致問題。一些症狀是

  • mysqld 在啟動期間停止回應 (在其寫入 ready for connections 之前)。

  • mysqldpthread_mutex_lock()pthread_mutex_unlock() 呼叫期間當機。

在這種情況下,您應該在啟動 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 不會釋放舊執行緒的記憶體。您可以透過將 thread_cache_size 設定為等於 max_connections + 1 的值來啟動 mysqld 來避免此問題。在大多數情況下,只需使用 --thread_cache_size=5' 即可提供很大的幫助!

如果您希望在 Linux 上,當 mysqld 因為 SIGSEGV 訊號而終止時取得核心傾印 (core dump),您可以使用 --core-file 選項啟動 mysqld。這個核心檔案可以用來產生回溯追蹤 (backtrace),這可能有助於您找出 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 環境變數來開啟除錯資訊。