gcore 抓取core文件
# 安装 gdb(包含 gcore)
sudo apt install gdb
# 抓取指定 PID 的 core 文件
sudo gcore -o /var/crash/core_<进程名> <PID>
# 示例:抓取 PID 为 1234 的进程
sudo gcore -o /var/crash/core_myapp 1234
gdb 将调试信息输出到文件
# 开启日志记录
(gdb) set logging enabled on # 开启日志
(gdb) set logging file /tmp/gdb.log # 指定日志文件(默认 gdb.txt)
(gdb) set logging overwrite on # 覆盖模式(默认追加)
# 执行调试命令,输出会自动写入文件
(gdb) info threads
(gdb) thread apply all bt full
(gdb) info registers
# 关闭日志
(gdb) set logging enabled off
调试进程卡死
# 查看线程信息
(gdb) info threads
# 输出示例:
# Id Target Id Frame
# * 1 Thread 0x7f8b... __GI___poll (...)
# 2 Thread 0x7f8a... futex_wait_cancelable (...)
# 3 Thread 0x7f89... __lll_lock_wait (...)
# 查看所有线程的调用栈
(gdb) thread apply all bt full
# 只查看阻塞在锁的线程
(gdb) thread apply all bt | grep -A5 "pthread_mutex_lock|futex"
# 查看锁的持有者
(gdb) p *(pthread_mutex_t*)0x5555aaaa
# glibc 2.27+ 可能显示:
# {
# __data = {
# __lock = 2, # 2 表示已锁定
# __count = 0, # 递归锁的计数
# __owner = 12345, # 持有者的线程 ID!
# __nusers = 1,
# ...
# }
# }
# 根据 __owner 找到线程
(gdb) info threads
# 找 LWP 12345 对应的线程编号
# 如果 __owner 显示为 0 或找不到
# 说明锁的状态可能损坏,或持有者已经崩溃/退出