linux gdb除錯執行緒

2021-09-29 14:46:33 字數 2425 閱讀 9863

更多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 是當乙個...