1. 程式人生 > >Linux下gdb除錯多執行緒

Linux下gdb除錯多執行緒

gdb除錯多執行緒,目前我知道的就以下幾條指令,當然編譯的時候需要加-g選項。

  • info threads
    顯示所有執行緒,系統會給每個執行緒都分配一個編號,編號前帶“*”的,是當前正在除錯的執行緒。
    這裡寫圖片描述
    上圖中LWP指的是輕量級程序,Linux下沒有真正意義上的執行緒,所有的執行緒都是用程序模擬的。所以執行緒又叫輕量級程序。
    __kernel_vsyscall(),是Linux系統呼叫的輔助機制, __kernel_vsyscall是Linux執行系統呼叫後的返回地址。
  • thread 執行緒編號
    用於切換除錯執行緒,如:
thread 2;//將當前除錯執行緒切換為2號執行緒

這裡寫圖片描述

  • thread apply [編號…] [command]
    讓一個活多個執行緒執行命令command。多個執行緒編號用空格隔開。如:
thread apply 1 2 bt //讓編號為1和2的執行緒執行命令bt,顯示呼叫棧。

這裡寫圖片描述

  • thread apply all [command]
    讓所有的執行緒都執行命令command。如:
thread apply all bt

這裡寫圖片描述

  • set scheduler-locking [off][on][step]
    我們在除錯時,總是所有執行緒一起執行的。如何讓單獨的一個執行緒獨自執行呢?這條命令就可以達到這一目的。此命令有三個狀態:
    ①off,預設狀態,所有執行緒一起執行。
    ②on,讓當前除錯的執行緒單獨執行。
    ③step,在此種狀態下進行單步除錯,如果碰到一行程式碼僅僅是普通的語句沒有函式呼叫,則只執行當前執行緒;若發生了函式呼叫,則所有執行緒一起執行。如下圖:
    這裡寫圖片描述