以boost thread爲例:ios
1 #include <boost/thread.hpp> 2 #include <iostream> 3 4 void wait(int seconds) { 5 boost::this_thread::sleep(boost::posix_time::seconds(seconds)); 6 } 7 8 void thread1() { 9 while (1) { 10 wait(1); 11 std::cout << boost::this_thread::get_id() << std::endl; 12 } 13 } 14 15 void thread2() { 16 while (1) { 17 wait(1); 18 std::cout << boost::this_thread::get_id() << std::endl; 19 } 20 } 21 22 int main() { 23 boost::thread t1(thread1); 24 boost::thread t2(thread2); 25 t1.join(); 26 t2.join(); 27 return 1; 28 }
使用gdb進行編譯:g++ -std=c++11 -g -Wall -I/usr/local/boost/include testThread.cpp -L/usr/local/boost/lib -lboost_system -lboost_thread -o testThread (其中boost庫的頭文件路徑和庫路徑爲安裝boost所在路徑)c++
1. 首先使用ps命令查看線程及線程間關係多線程
ps aux | grep testThread 查看當前運行的線程併發
ps -aL | grep testThread 查看當前運行的輕量級線程app
pstree -p 主線程id 查看主線程和新線程之間的關係函數
pstack 線程id 查看線程的線程棧結構測試
如下爲上面代碼的測試結果:this
查看主線程堆棧:spa
查看新線程堆棧:線程
2. gdb調試多線程
gdb attach 主線程id
info 查看進程和線程信息,info inferiors查看進程,info threads查看全部線程,*爲當前線程,thread n切換到第n個線程,bt查看線程棧結構。
只運行當前線程: set scheduler-locking on 和全部線程併發運行: set scheduler-locking off
切換到某一線程時,實際調試過程和普通的調試程序同樣,用break添加斷點,n進行下一步。
3. 調試多線程的命令總結以下:
命令 | 用法 |
info threads | 顯示當前可調試的全部線程,每一個線程會有一個GDB爲其分配的ID,後面操做線程的時候會用到這個ID。 前面有*的是當前調試的線程 |
thread ID(1,2,3…) | 切換當前調試的線程爲指定ID的線程 |
break testThread.cpp:5 thread all(例:在相應函數的位置設置斷點break wait) | 在全部線程中相應的行上設置斷點 |
thread apply ID1 ID2 command | 讓一個或者多個線程執行GDB命令command |
thread apply all command | 讓全部被調試線程執行GDB命令command |
set scheduler-locking 選項 command | 設置線程是以什麼方式來執行命令 |
set scheduler-locking off | 不鎖定任何線程,也就是全部線程都執行,這是默認值 |
set scheduler-locking on | 只有當前被調試程序會執行 |
set scheduler-locking on step | 在單步的時候,除了next過一個函數的狀況(熟悉狀況的人可能知道,這實際上是一個設置斷點而後continue的行爲)之外,只有當前線程會執行 |