【问题标题】:debugging a running daemon with GDB使用 GDB 调试正在运行的守护进程
【发布时间】:2019-10-26 14:42:49
【问题描述】:

我想用 GDB 调试一个正在运行的守护进程。我有相应进程的进程ID。我输入:gdb attach process id info threads

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

现在我正在发送:

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

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

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

请帮帮我..我是新人

【问题讨论】:

    标签: c gdb pthreads freeze


    【解决方案1】:

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

    你可能拿错了。

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

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

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

    一般来说,跟踪多线程进程是一件傻事,因为你正在跟踪进程这一事实会改变执行环境,并且经常导致它不再匹配执行而不进行跟踪。

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

    【讨论】:

      猜你喜欢
      • 2013-04-16
      • 2011-01-04
      • 1970-01-01
      • 2023-03-02
      • 2011-01-19
      • 1970-01-01
      • 2021-10-27
      • 2014-07-15
      • 1970-01-01
      相关资源
      最近更新 更多