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, 个人实践验证,特此记录,留作后续参考。
标签:Thread,..,二进制,LWP,unix,gdb,sysdeps,多线程 From: https://www.cnblogs.com/brian-sun/p/18160379