gdb pid 執行緒 gdb多執行緒除錯

2021-10-17 05:52:39 字數 3670 閱讀 8485

死鎖除錯

1) -g引數

2) attach

3) info threads

void *workthread( void *arg )

pthread_mutex_t mutex;

pthread_mutex_init(&mutex, 0);

usleep(1000*1000);

fprintf(stderr,"timeout we will start dead lock\n");

pthread_mutex_lock(&mutex);

pthread_mutex_lock(&mutex);

}void *alivethread ( void *arg )

int main(int argc, char *ar**)

pthread_t alivepid;

pthread_create(&alivepid,0,alivethread,0);

pthread_t deadpid;

pthread_create(&deadpid, 0, workthread, 0);void *retval = 0;

pthread_join(deadpid,&retval);void *retval2 = 0;

pthread_join(alivepid,&retval2);return 0;

2.編譯執行 lock.c

[root@localhost ~]# gcc -g lock.c -pthread

[root@localhost ~]# ./a.out

timeout we will start dead lock

(程式掛起)

3.查詢程序id

[root@localhost ~]# ps -e | grep a.out

12826 pts/3    00:00:00 a.out //程序id為12826

gdb多執行緒除錯命令:

(gdb)info threads

顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。

前面有*的是當前除錯的執行緒。

(gdb)thread id

切換當前除錯的執行緒為指定id的執行緒。

讓乙個或者多個執行緒執行gdb命令command。

讓所有被除錯執行緒執行gdb命令command。

(gdb)set scheduler-locking off|on|step

估計是實際使用過多執行緒除錯的人都可以發現,在使用step或者continue命令除錯當前被除錯執行緒的時候,其他執行緒也是同時執行的,怎麼只讓被除錯程式執行呢?通過這個命令就可以實現這個需求。

off 不鎖定任何執行緒,也就是所有執行緒都執行,這是預設值。

on 只有當前被除錯程式會執行。

step 在單步的時候,除了next過乙個函式的情況(熟悉情況的人可能知道,這其實是乙個設定斷點然後continue的行為)以外,只有當前執行緒會執行。

//顯示執行緒堆疊資訊

(gdb) bt

察看所有的呼叫棧

(gdb) f 3

呼叫框層次

(gdb) i locals

顯示所有當前呼叫棧的所有變數

4.啟動gdb attach 程序

[root@localhost ~]#gdb a.out 12826

gnu gdb (gdb) centos (7.0.1-45.el5.centos)

license gplv3+: gnu gpl version 3 or later

this is free software: you are free to change and redistribute it.

there is no warranty, to the extent permitted by law.  type "show copying"

and "show warranty" for details.

this gdb was configured as "i386-redhat-linux-gnu".

for bug reporting instructions, please see:

reading symbols from /root/a.out...done.

attaching to program: /root/a.out, process 12826

reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done.

[thread debugging using libthread_db enabled]

[new thread 0xb7524b90 (lwp 12828)]

[new thread 0xb7f25b90 (lwp 12827)]

loaded symbols for /lib/libpthread.so.0

reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.

loaded symbols for /lib/libc.so.6

reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.

loaded symbols for /lib/ld-linux.so.2

0x00502402 in __kernel_vsyscall ()

(gdb) info threads //顯示所有執行緒資訊

3 thread 0xb7f25b90 (lwp 12827)  0x00502402 in __kernel_vsyscall ()

2 thread 0xb7524b90 (lwp 12828)  0x00502402 in __kernel_vsyscall ()

* 1 thread 0xb7f266c0 (lwp 12826)  0x00502402 in __kernel_vsyscall ()

(gdb) thread 2  //跳到第2個執行緒

[switching to thread 2 (thread 0xb7524b90 (lwp 12828))]#0  0x00502402 in __kernel_vsyscall ()

(gdb) bt  //檢視執行緒2的堆疊,可以發現該執行緒堵塞在lock.c第17行

#0  0x00502402 in __kernel_vsyscall ()

#1  0x0072e839 in __lll_lock_wait () from /lib/libpthread.so.0

#2  0x00729e9f in _l_lock_885 () from /lib/libpthread.so.0

#3  0x00729d66 in pthread_mutex_lock () from /lib/libpthread.so.0

#4  0x080485b4 in work_thread (arg=0x0) at lock.c:17

#5  0x00727912 in start_thread () from /lib/libpthread.so.0

#6  0x0066660e in clone () from /lib/libc.so.6

(gdb)

參考自

另一篇:

gdb pid 執行緒 gdb除錯多執行緒

gdb 多執行緒除錯基本命令 實現簡介 以及乙個問題的解決 teawater gmail.com 一直對gdb多執行緒除錯接觸不多,最近因為工作有了一些接觸,簡單作點記錄吧。如果程式是多程序在跑,先將其設定成單程序模式 kamailio 檢視程序中所有執行緒的棧呼叫 pstack 程序pid pst...

gdb pid 執行緒 gdb除錯多程序多執行緒程式

一 除錯的指令 1.list命令 list linenum 顯示程式第linenum行的周圍的程式 list function 顯示程式名為function的函式的源程式 list 顯示當前行後面的源程式 list 顯示當前行前面的源程式 2.run r 執行命令 run args run命令可以直...

多執行緒程式設計 多執行緒gdb除錯

學習多執行緒程式設計怎麼能夠不會多執行緒 gdb 除錯呢?這一講主要學習多執行緒的 gdb 除錯。首先列出我們經常會使用到的指令 1 info threads 顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。前面有 的是當前除錯的線 程。2 t...