通過GDB non-stop mode 調試MySQL, 特別是用于復現死鎖場景, 需要按照一定的并發順序寫入才可以構造出來, 通過GDB non-stop mode 可以非常方便進行構造
但是用法是先開啟 GDB, 然后在 attach mysql_pid 才可以. 不能啟動的時候就 attach 到 mysql pid
可以通過設置set non-stop on, non-stop mode 來實現gdb 只block 一個thread, 然后其他thread 繼續執行的方法.
In non-stop mode, when a thread stops to report a debugging event, only that thread is stopped;
經常需要配合這幾個一起用
set target-async 1
set pagination off
set non-stop on
這一行可以直接啟動的時候就設置好
gdb —quiet -ex ‘set pagination off’ -ex ‘set target-async on’ -ex ‘set non-stop on’
在 non-stop mode 里面, 如果斷點被某一個線程命中, 那么只有該線程是停止的, 其他線程繼續 running.. 上圖可以看到只有 Thread 66 是停止的, 其他 Thread 都在運行鐘.
在 non-stop mode 中, 如果想讓其他所有 Thread 繼續運行, 需要執行 c -a(continue -a), 如果只是執行 c(continue), 那么只有當前 thread 運行.
通過 continue 只運行當前 Thread, 就可以切換 Thread, 執行 continue, 做到多個 Thread 輪流運行的效果, 用于復雜場景復現.
比如這個 example 把斷點打在 do_command 上面, 那么就兩個 client 連接進來執行 命令以后, 都停止在了 do_command 上, 這個時候可以按照我們的需求去執行哪一個 thread.
比如我這里又增加了一個 breakpoint lock_rec_lock, 我想讓 Thread 66 先執行, 那么我就t 66, 然后在這里執行 continue, 那么就會發現 t 66 跳到下一個斷點.
這個時候可以再切到 Thread 67 讓他去執行, 因為 Thread 66 已經斷在一個地方了. 這個時候我們直接讓 Thread 67 執行完成就變成這樣
可以看到 Thread 66 還停在這里, 但是 Thread 67 已經執行結束了.
-
內核
+關注
關注
3文章
1337瀏覽量
40085 -
調試
+關注
關注
7文章
551瀏覽量
33765 -
MySQL
+關注
關注
1文章
789瀏覽量
26286
原文標題:通過GDB non-stop mode 調試MySQL
文章出處:【微信號:inf_storage,微信公眾號:數據庫和存儲】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論