gdb 調試多線程


以boost thread為例:

 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所在路徑)

1. 首先使用ps命令查看線程及線程間關系

ps aux | grep testThread  查看當前運行的線程

ps -aL | grep testThread 查看當前運行的輕量級線程

pstree -p 主線程id 查看主線程和新線程之間的關系

pstack 線程id 查看線程的線程棧結構

以下為上面代碼的測試結果:

查看主線程堆棧:

查看新線程堆棧:

 

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的行為)以外,只有當前線程會執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM