調試多線程的相關指令
顯示所有進程
info threads
這條指令顯示可以調試的所有線程,gdb會爲每個線程分配一個ID,這個ID和線程ID不同,ID號一般從1開始。
切換線程指令
爲什麼要切換線程呢?因爲gdb默認在調試多線程程序時只跟蹤主線程,而新創建的線程都阻塞在線程創建函數pthread_create處。如果我們不切換,那麼我們就無法調試我們在主線程中所創建的線程。
thread ID
這條指令用來切換當前調試的線程爲指定的ID號的線程,ID爲GDB爲線程所分配的ID.
多個線程控制指令
//指定多個線程執行command指令,其中command爲gdb中的指令
thread apply ID1 ID2 ...IDn command
//指定所有線程執行command指令,其中command爲gdb中的指令
thread apply all command
設置線程調試狀態指令
線程鎖
//線程鎖
set scheduler-locking off|on
off:不鎖定任何線程,當程序繼續運行的時候如果有斷點,那麼就把所有的線程都暫停下來,直到你指定某個線程繼續執行,如果在當前線程下使用continue的話那麼會啓動所有線程(GDB默認);
on:打開線程鎖,鎖定其他線程,只有當前線程執行。
non-stop模式
爲了對上面的這種一個線程中斷在一個斷點上,其他所有的線程都會被freeze. gdb v7.0引入了non-stop模式,在這個模式下:
1. 當某個或多個線程在一個斷點上,其他線程仍會並行運行
2. 你可以選擇某個被中斷的線程,只讓他運行。
3. non-stop模式表示不停止模式,除了斷點有關的進程會被停下來,其他線程會繼續執行。
設置non-stop模式,打開gdb後,在開始r之前,首先連續輸入下面的指令
set target-async 1
set pagination off
set non-stop on
參考文章鏈接:https://blog.csdn.net/bit_clearoff/article/details/59596419