是否可以通过systemtap探针停止进程,以便可以附加gdb?

时间:2013-12-10 10:44:20

标签: c++ linux gdb signals systemtap

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

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

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

不幸的是,上面没有编译......任何想法?


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

#!/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());
    }
}

1 个答案:

答案 0 :(得分:5)

参见man function :: raise(3stap),new from systemtap 2.3(2013-07-25)。

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

你需要guru模式让你的脚本使用这个功能。