c++ - 是否可以通过 systemtap 探测器停止进程以便附加 gdb?

标签 c++ linux gdb signals systemtap

我们有一个多进程应用程序,其中调试特定的子进程被证明是困难的。由于进程之间的消息传递超时,我们没有时间将 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());
    }
}

最佳答案

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

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

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

关于c++ - 是否可以通过 systemtap 探测器停止进程以便附加 gdb?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20492308/

相关文章:

c++ - 为什么运营商 `?:` 没有优先级?

c++ - 未声明的变量在 C++ 中合法吗?

Android 文件系统日志

linux - 如何将两个或多个文本文件添加到一个包含列的文本文件中? (在 Linux 或 Windows 下)

GDB 设置替代路径不起作用

c++ - const_iterator 到迭代器 C++ 错误

c++ - 关于重载->运算符中const关键字具体位置的问题

c++ - 伐木礼仪

c - 优胜美地 : SIGBUS error when calling function at gdb command line 上的 gdb

GDB 日志文件位置