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

时间:2019-10-26 14:42:49

标签: c gdb pthreads hang

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

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

现在我要发送:

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

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

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

请帮助我。我是新来的

1 个答案:

答案 0 :(得分:0)

  

我尝试使用服务名称状态命令。

您可能认为错误。

执行systemctl kill daemonname之后,您想将GDB附加到进程中,并查看它被卡在哪里 (使用thread apply all where)。

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

  

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

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

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