1. 執行緒的檢視
首先建立兩個執行緒:
#include
#include
#include
#include
#include
void* pthread_run1(void* arg)
void* pthread_run2(void* arg)
int main()
{
pthread_t tid1;
pthread_t tid2;
pthread_create(&tid1,null,pthread_run1,null);
pthread_create(&tid2,null,pthread_run2,null);
printf("i am main thread\n");
pthread_join(tid1,null);
pthread_join(tid2,null);
return
0;
分析:上面程式中建立了兩個執行緒,程式執行起來,main函式所在程式為主執行緒,在這個主線程中有兩個新執行緒執行
命令列檢視:
//檢視當前執行的程序
ps aux|grep a.out
//檢視當前執行的輕量級程序
ps -al|grep a.out
//檢視主線程和新執行緒的關係
pstree -p 主線程id
2. 執行緒棧結構的檢視
1. 獲取執行緒id
2. 通過命令檢視棧結構 ps stack 執行緒id
3. 利用gdb檢視執行緒資訊將程序附加到gdb偵錯程式當中,檢視是否建立了新執行緒:gdb attach 主線程id
檢視執行緒的一些資訊
//1.檢視程序:info inferiors
//2.檢視執行緒:info threads
//3.檢視執行緒棧結構:bt
//4.切換執行緒:thread n(n代表第幾個執行緒)
4. 利用gdb除錯多執行緒
當程式沒有啟動,執行緒還沒有執行,此時利用gdb除錯多執行緒和除錯普通程式一樣,通過設定斷點,執行,檢視資訊等等,在這裡不在演示,最後會加上除錯執行緒的命令
設定斷點
//1. 設定斷點:break 行號/函式名
//2. 檢視斷點:info b
執行執行緒2的函式,指行完畢繼續執行到斷點處
2. 重新啟動程式執行到斷點處:r
只執行當前執行緒
1. 設定:set scheduler-locking on
2. 執行:n
所有執行緒併發執行
1. 設定:set scheduler-locking off
2. 執行:n
總結除錯多執行緒的命令命令
用法info threads
顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。 前面有*的是當前除錯的執行緒
thread id(1,2,3…)
切換當前除錯的執行緒為指定id的執行緒
break thread_test.c:123 thread all(例:在相應函式的位置設定斷點break pthread_run1)
在所有執行緒中相應的行上設定斷點
讓乙個或者多個執行緒執行gdb命令command
讓所有被除錯執行緒執行gdb命令command
set scheduler-locking 選項 command
設定執行緒是以什麼方式來執行命令
set scheduler-locking off
不鎖定任何執行緒,也就是所有執行緒都執行,這是預設值
set scheduler-locking on
只有當前被除錯程式會執行
set scheduler-locking on step
在單步的時候,除了next過乙個函式的情況(熟悉情況的人可能知道,這其實是乙個設定斷點然後continue的行為)以外,只有當前執行緒會執行
1. 執行緒的檢視
首先建立兩個執行緒:
#include
#include
#include
#include
#include
gdb多執行緒除錯
先介紹一下gdb多執行緒除錯的基本命令。info threads顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。前面有 的是當前除錯的執行緒。thread id切換當前除錯的執行緒為指定id的執行緒。break thread test.c 12...
gdb 除錯多執行緒
設定core環境 uname a 檢視機器引數 ulimit a 檢視預設引數 ulimit c 1024 設定core檔案大小為1024 ulimit c unlimit 設定core檔案大小為無限 多執行緒如果dump,多為段錯誤,一般都涉及記憶體非法讀寫。可以這樣處理,使用下面的命令開啟系統開...
gdb 多執行緒除錯
推薦閱讀 先介紹一下gdb多執行緒除錯的基本命令。info threads顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。前面有 的是當前除錯的執行緒。thread id切換當前除錯的執行緒為指定id的執行緒。break thread test...