《軟體除錯的藝術》筆記--除錯多執行緒程式
下面是於執行緒相關的GDB命令用法彙總:
info threads:給出關於當前所有執行緒的資訊。
thread 3:改成執行緒3.
break 88 thread 3 :當執行緒到達原始碼88時停止執行。
break 88 thread 3 if i == 2 當執行緒3到達原始碼行88行,並且變數i的值為2時停止執行。
對下面的多執行緒進行除錯:
除錯結果:#include <stdio.h> #include <pthread.h> #include <string.h> #include <unistd.h> void* thr_fn(void* arg) { int i; for (i=0; i<5; i++) { printf("in thread%d,i=%d\n",*(int*)arg,i); sleep(1); } return (void*)0; } int main(void) { int ret; pthread_t tid1, tid2; int t1_para = 1; int t2_para = 2; ret = pthread_create(&tid1, NULL, thr_fn, (void*)&t1_para); if (ret != 0) { printf("thread1 pthread_create:%s\n",strerror(ret)); return 1; } ret = pthread_create(&tid2, NULL, thr_fn, (void*)&t2_para); if (ret != 0) { printf("thread1 pthread_create:%s\n",strerror(ret)); return 1; } pthread_join(tid1, NULL); pthread_join(tid2, NULL); return 0; }
(gdb) b main
Breakpoint 1 at 0x4006d9: file pthread.c, line 20.
(gdb) r
Starting program: /home/yanwenjie/ctest/a.out
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, main () at pthread.c:20
warning: Source file is more recent than executable.
20int t1_para = 1;
(gdb) n
21int t2_para = 2;
(gdb)
23ret = pthread_create(&tid1, NULL, thr_fn, (void*)&t1_para);
(gdb)
[New Thread 0x7ffff77fc700 (LWP 5366)]
in thread1,i=0
24if (ret != 0) {
(gdb)
29ret = pthread_create(&tid2, NULL, thr_fn, (void*)&t2_para);
(gdb)
[New Thread 0x7ffff6ffb700 (LWP 5367)]
in thread2,i=0
30 if (ret != 0) {
(gdb) info threads
Id Target Id Frame
3 Thread 0x7ffff6ffb700 (LWP 5367) "a.out" 0x00007ffff78bd08d in nanosleep
() from /lib/x86_64-linux-gnu/libc.so.6
2 Thread 0x7ffff77fc700 (LWP 5366) "a.out" 0x00007ffff78bd08d in nanosleep
() from /lib/x86_64-linux-gnu/libc.so.6
* 1 Thread 0x7ffff7fe3700 (LWP 5363) "a.out" main () at pthread.c:30
(gdb) break 10 thread 3 if i==3
Breakpoint 2 at 0x400699: file pthread.c, line 10.
(gdb) c
Continuing.
in thread2,i=1
in thread1,i=1
in thread1,i=2
in thread2,i=2
in thread1,i=3
[Switching to Thread 0x7ffff6ffb700 (LWP 5367)]
Breakpoint 2, thr_fn (arg=0x7fffffffe048) at pthread.c:10
10printf("in thread%d,i=%d\n",*(int*)arg,i);
(gdb) p i
$1 = 3
(gdb) thread 2
[Switching to thread 2 (Thread 0x7ffff77fc700 (LWP 5366))]
#0 0x00007ffff78bd08d in nanosleep () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) n
Single stepping until exit from function nanosleep,
which has no line number information.
in thread2,i=3
0x00007ffff78bcf2c in sleep () from /lib/x86_64-linux-gnu/libc.so.6
(gdb) break 10 thread 3
Note: breakpoint 2 (thread 3) also set at pc 0x400699.
Breakpoint 3 at 0x400699: file pthread.c, line 10.
(gdb) c
Continuing.
in thread1,i=4
[Switching to Thread 0x7ffff6ffb700 (LWP 5367)]
Breakpoint 3, thr_fn (arg=0x7fffffffe048) at pthread.c:10
10printf("in thread%d,i=%d\n",*(int*)arg,i);
(gdb) p i
$2 = 4
(gdb) p arg
$3 = (void *) 0x7fffffffe048
(gdb) p *(int*)arg
$4 = 2
(gdb)