c - 使用 GDB 调试正在运行的守护进程

标签 c gdb pthreads freeze

我想使用 GDB 调试正在运行的守护进程。我有各个进程的进程ID。我输入:gdb附加进程ID信息线程

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

现在我发送:

systemctl Kill daemonname(这个命令我在其他终端上运行)

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

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

请帮助我..我是新人

最佳答案

I tried with the service-name status command.

你可能理解错了。

执行systemctl Kill daemonname后,您希望将GDB附加到进程并查看它卡在哪里(使用thread apply all where).

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

I want to trace the last thread that is getting stuck

一般来说,跟踪多线程进程是一件愚蠢的事情,因为跟踪进程的事实会改变执行环境,并且通常会导致它在没有跟踪的情况下不再匹配执行。

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

关于c - 使用 GDB 调试正在运行的守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58571799/

相关文章:

c++ - qtcreator + gdb,扩展宏定义

c - 使用线程在数组中查找最大值?

c - 我的循环在多线程中无法正常运行

比较字符串中的 N 个字节

c - 如何将参数传递给我的应用程序,其中包括 gdb 上的 - 符号?

c - 如何在 C 中导入 DLL 函数?

c++ - 使用 gdb 使用 Rcpp 调试 R 包的 C++ 代码无法使用 R_PV(未知返回类型)打印变量值

linux - pthread_exit() 和初始线程

c - 递归控制流程

c - printf 在类型与类型说明符不匹配的情况下如何工作?