Ladies and gentlemen, 今天我们来说工具常考的第2个面试题:“ gdb如何调试多线程程序”的第2小节, 这个话题一共是4个小节。
【【快手/腾讯面试题】gdb面试题2-2-1 如何使用gdb调试多线程程序-多线程调试基础技能:查看线程信息 切换线程 切换到某层调】 https://www.bilibili.com/video/BV1dN4y1f7ng/?share_source=copy_web&vd_source=1de4bbd746d463f3e044efb880331206
- 代码准备和熟悉
- 调试程序的技能点
- 查看线程信息
- 切换线程
- 切换到某层调用堆栈
- 理解调度器锁模式
1. 查看和设置调度器锁
2. 测试调度器锁为step模式 - 多线程调试崩溃的例子
- 多线程调试死锁的例子
本小结思路:
- 查看线程信息
- 切换线程
- 切换到某一层堆栈
- 查看线程信息
info threads
(gdb) info threads
[New Thread 0x7ffff6fef700 (LWP 3636)]
Id Target Id Frame
3 Thread 0x7ffff6fef700 (LWP 3636) "thread_gdb" 0x00007ffff7bcd51c in __lll_lock_wait_private () from /lib64/libpthread.so.0
* 2 Thread 0x7ffff77f0700 (LWP 3635) "thread_gdb" thread_entry_funcA (arg=0x0) at thread_gdb.c:8
1 Thread 0x7ffff7fec740 (LWP 3631) "thread_gdb" 0x00007ffff78efad1 in clone () from /lib64/libc.so.6
- 切换线程
t [线程ID]
(gdb) t 1
[Switching to thread 1 (Thread 0x7ffff7fec740 (LWP 3631))]
#0 0x00007ffff78efad1 in clone () from /lib64/libc.so.6
(gdb) t 2
[Switching to thread 2 (Thread 0x7ffff77f0700 (LWP 3635))]
#0 thread_entry_funcA (arg=0x0) at thread_gdb.c:8
8 printf("[thread_entry_funcA]: %d\n", i);
- 切换到某一层堆栈
f [堆栈号]
(gdb) f 0
#0 thread_entry_funcA (arg=0x0) at thread_gdb.c:8
8 printf("[thread_entry_funcA]: %d\n", i);