gdb多執行緒除錯

2021-10-25 09:36:00 字數 2982 閱讀 9670

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...