更多linux知識點:linux目錄索引
1. 執行緒的檢視
首先建立兩個執行緒:
#include
#include
#include
#include
#include
void* pthread_run1(void* arg)
}void* pthread_run2(void* arg)
}int main()
分析:上面程式中建立了兩個執行緒,程式執行起來,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
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的行為)以外,只有當前執行緒會執行
linux gdb 除錯多執行緒
最近遇到乙個問題,乙個程序裡啟用了多執行緒,然後乙個執行緒掛掉了,產生了coredump檔案,但是gdb無法跟蹤到是哪乙個執行緒,沒辦法只能重新跑一邊,gdb當前程序,加入斷點,看運 況,步驟如下 1 top 檢視正在執行的程式 2 啟動gdb,attach 需要除錯的程序pid 或者知道程序的名字...
Linux gdb除錯多執行緒
我們這裡仍舊將gdb的基本操作在這裡羅列一下 list l 行號 顯示源 一次顯示10行 list l 函式名 列出某個函式的源 r或run 執行程式 s或step 進入函式呼叫 breaktrace bt 檢視函式呼叫棧 info i locals 檢視當前棧幀區域性變數的值 info break...
linux gdb 除錯多執行緒
1 用 kill 命令產生 core dump檔案 kill 11 pid 用訊號11殺掉它,會讓程序產生乙個 segmentation fault,從而產生乙個 core dump,得到乙個 core 檔案,裡面包含了死鎖的時候,程序的記憶體映象。其中訊號11表示 sigse sigse 是當乙個...