使用GDB调试正在运行的守护程序

问题描述 投票:0回答:1

我想用GDB调试正在运行的守护程序。我有相应进程的进程ID。我输入了:gdb附加进程ID信息线程

我正在获取线程列表。 *一个是当前正在运行的线程(如果我错了,请纠正我)

现在我正在发送:

systemctl kill守护进程名称(此命令我正在其他终端上运行)

现在我想在单击此命令后检查正在运行哪个线程。

因为我的守护进程被卡住了。它无法正常杀死。我尝试使用service-name status命令。由于上面的“ servicename status”命令后卡住了。我想跟踪最后一个被卡住的线程,因为我的守护程序仍然没有被杀死,但是运行用于检查该守护程序状态的命令被卡住,输出没有输出。如果应该正确终止服务,则应显示该服务未运行或找不到命令。

请帮助我。我是新手

c gdb pthreads hang
1个回答
0
投票

我尝试使用service-name status命令。

您可能认为错误。

执行systemctl kill daemonname之后,您想将GDB附加到进程,并查看where卡住了(使用thread apply all where)。

[您可能会看到线程处于死锁状态(例如,线程T1正在等待由线程T2持有的互斥锁A;线程T2正在等待由线程T1持有的互斥锁B)。

我想跟踪被卡住的最后一个线程

通常,跟踪多线程进程是一个愚蠢的错误,因为您正在跟踪该进程的事实会更改执行环境,并且经常导致它不再与没有跟踪的执行相匹配。

相反,您应该考虑不变量,并确保不违反它们。

© www.soinside.com 2019 - 2024. All rights reserved.