gdb

1 阅读1分钟

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 或找不到
# 说明锁的状态可能损坏,或持有者已经崩溃/退出