linux gdb 调试多线程

部署运行你感兴趣的模型镜像

最近遇到一个问题,一个进程里启用了多线程,然后一个线程挂掉了,产生了coredump文件,但是gdb无法跟踪到是哪一个线程,没办法只能重新跑一边,gdb当前进程,加入断点,看运行情况,步骤如下:

1、top 查看正在运行的程序;

2、启动gdb,attach 需要调试的进程pid;(或者知道进程的名字直接gdb attach pidof raid_server);

3、加入断点,continue gdb;

4、然后运行到出问题的线程出了segment fault错误;

5、bt查看堆栈信息,定位代码错误原因;

您可能感兴趣的与本文相关的镜像

Anything-LLM

Anything-LLM

AI应用

AnythingLLM是一个全栈应用程序,可以使用商用或开源的LLM/嵌入器/语义向量数据库模型,帮助用户在本地或云端搭建个性化的聊天机器人系统,且无需复杂设置

### 使用 GDB 调试多线程程序的具体指令和技巧 #### 编译准备 为了能够有效地使用 GDB 调试多线程程序,编译时需添加 `-g` 参数以包含调试信息,并禁用优化选项(如 `-O0`),从而确保生成的可执行文件保留完整的符号表信息。例如,在 C++ 中可以通过以下命令完成编译: ```bash g++ -g -O0 -pthread main.cpp -o app ``` #### 启动 GDB 并加载目标程序 启动 GDB 的方式如下所示,其中 `app` 是待调试的目标程序名称: ```bash gdb ./app ``` 随后可通过 `run` 命令启动程序。 #### 查看所有线程的状态 在 GDB 中,可以利用 `info threads` 命令获取当前进程中所有线程的相关信息[^5]。此命令会返回每一线程的 ID、目标标识以及对应的函数调用位置等内容。例如: ``` (gdb) info threads Id Target Id Frame * 1 Thread 0x7f... (LWP 1234) "app" 0x000055... in main () 2 Thread 0x7f... (LWP 1235) "app" __lll_lock_wait () at ../nptl/sysdeps/.../lowlevellock.h:135 3 Thread 0x7f... (LWP 1236) "app" epoll_wait (epfd=4, events=0x7f..., maxevents=64, timeout=-1) at ../sysdeps/unix/sysv/linux/epoll_wait.c:30 ``` #### 切换至指定线程 如果需要专注于某一特定线程的操作,则可以借助 `thread <ID>` 命令实现切换,其中 `<ID>` 表示目标线程编号[^3]。例如,要切换到第 2 号线程,输入: ``` (gdb) thread 2 ``` #### 设置针对某一线程的断点 除了常规断点外,还可以设定仅适用于某个具体线程的条件断点。语法形式为 `break <line> thread <tid>` 或更复杂的表达式 `break <line> thread <tid> if condition`。下面展示两个实例: - 当线程 2 达到源码中的第 10 行时暂停: ``` (gdb) break 10 thread 2 ``` - 若线程 2 在相同行号处满足变量 x 和 y 相等这一前提才中断: ``` (gdb) break 10 thread 2 if x == y ``` #### 获取单个或全部线程的回溯信息 对于单一选定线程而言,执行 `bt` 即能显示其堆栈跟踪详情;而对于整个应用内的所有活动线程来说,采用 `thread apply all bt` 将一次性呈现它们各自的调用链路图景^。 ``` (gdb) thread apply all bt ``` #### 定位死锁问题 面对潜在的多线程死锁状况,有多种策略可供选择。一种常见做法是在发生阻塞期间强制生成 core dump 文件后再加以剖析,这通常涉及向进程发送 SIGSEGV 信号 (`kill -11`) 来触发异常终止行为[^4]。另一种途径则是依赖详尽的日志记录机制辅助诊断流程走向。当然也可以尝试运用前面提到的各种交互手段逐步探索根本原因所在之处。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值