【问题标题】:Can a process be stopped via a systemtap probe so gdb can be attached?可以通过 systemtap 探针停止进程以便可以附加 gdb 吗?
【发布时间】:2013-12-11 22:37:42
【问题描述】:

我们有一个多进程应用程序,其中调试特定子进程被证明是困难的。由于进程之间的消息传递超时,我们没有时间将 gdb 附加到目标子进程,所以我想知道是否可以通过 systemtap 探针停止进程?

我认为应该需要一个简单的探测,例如:

probe process("exeName").mark("STOP_HERE")
{
    force_sig(SIGSTOP, current);
}

不幸的是,上面没有编译...有什么想法吗?


我不是 systemtap 专家,所以这可能不是最好的解决方案,但对于任何有兴趣的人来说,这是我的粗略解决方案:

#!/bin/stap -g

global gdbRunning = 0;

probe process(@1).mark(@2)
{
    raise(%{ SIGSTOP %});

    gdbCmd = sprintf("cgdb -- -q -ex 'thread find %d' %s %d", tid(), @1, pid());

    if (gdbRunning == 0)
    {
        gdbRunning = 1;
        printf("STOP PID %d TID %d [%s]\n", pid(), tid(), gdbCmd);
        system(gdbCmd);
    }
    else
    {
        printf("STOP PID %d TID %d\n", pid(), tid());
    }
}

【问题讨论】:

  • 我建议您使用单个子进程开始您的进程。从单个孩子开始而不是创建多个然后编写处理程序来阻止它们会更容易..
  • 拉希特耆那教;感谢您的建议,但不幸的是,这不是一个选择 - 它会让事情变得更容易。我可能出于兴趣尝试的另一种选择是 lldb,它启动并且可以比 gdb 更快地连接(但我坚持 fche 对 mo 的回答)。

标签: c++ linux gdb signals systemtap


【解决方案1】:

参见 man function::raise(3stap),自 systemtap 2.3 (2013-07-25) 起新增。

stap -g -e 'probe WHATEVER { raise(%{ SIGSTOP %}) }'

您需要大师模式才能让您的脚本使用此功能。

【讨论】:

  • 太好了,非常感谢 - 这正是我所追求的 :) 我愚蠢地试图通过 set_task_state(...) 设置每个线程的任务状态,但奇怪的是这不起作用因为它并没有真正告诉内核我正在尝试做什么。不知道为什么我没有想到 kill(...) 替代方案,即 raise(...)!!谢谢!
  • 噢!我会在文档中直接阅读过去的 raise! ... "function::raise — 在当前线程中发出信号" :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2011-03-09
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
相关资源
最近更新 更多