gdb 根据c语言二进制文件进程号查看内部多线程任务

C语言二进制文件 a 编译时添加了 -g (gdb 调试), 但是 gdb a 这种方式有时不容易复现一些场景。这时可以先正常启动 a, 然后根据 a 的进程号启动gdb调试。

# 1. 找到程序进程号
ps aux | grep a
# 2. 使用 GDB 附加到该进程
sudo gdb -p [PID]
# 3. 使用 info threads 命令来列出所有线程
(gdb) info threads

 Id   Target Id         Frame 
* 1    Thread 0x7f67884d0700 (LWP 62890) "a" 0x00007f6787dc338d in nanosleep () at ../sysdeps/unix/syscall-template.S:84
  2    Thread 0x7f6781eb2700 (LWP 62892) "a" 0x00007f6787dc338d in nanosleep () at ../sysdeps/unix/syscall-template.S:84
  3    Thread 0x7f67816b1700 (LWP 62893) "a" 0x00007f6787dc338d in nanosleep () at ../sysdeps/unix/syscall-template.S:84
  4    Thread 0x7f6780eb0700 (LWP 63052) "a" __lll_lock_wait_private () at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:95
  5    Thread 0x7f677bfff700 (LWP 63053) "a" 0x00007f6787dc338d in nanosleep () at ../sysdeps/unix/syscall-template.S:84
  6    Thread 0x7f677b7fe700 (LWP 63054) "a" 0x00007f6787dee3dd in write () at ../sysdeps/unix/syscall-template.S:84
  7    Thread 0x7f677affd700 (LWP 63055) "a" 0x00007f6787dc338d in nanosleep () at ../sysdeps/unix/syscall-template.S:84

# 4. 可见程序 a 中有 7 个进程正在运行,选中其中一个进程查看
thread 1
# 5. 切换到感兴趣的线程后,使用 bt(或 backtrace)命令可以查看线程的调用堆栈。
bt
# 6. 完成调试后,可以使用 detach 命令来从进程中分离,然后使用 quit 退出 GDB
(gdb) detach
(gdb) quit

以上方法来自chatgpt, 个人实践验证,特此记录,留作后续参考。

posted @ 2024-04-26 16:29  BrianSun  阅读(93)  评论(0)    收藏  举报