gpt4 book ai didi

macos - 您能否在 DTrace 中以多 CPU 安全的方式比较探针之间的值?

转载 作者:行者123 更新时间:2023-12-04 09:47:45 24 4
gpt4 key购买 nike

我正在尝试编写一个执行以下操作的 DTrace 脚本:

  • 每当启动一个新线程时,增加一个计数。
  • 每当这些线程之一退出时,递减计数,如果计数现在为零,则退出脚本。

  • 我有这样的事情:
    BEGIN {
    threads_alive = 0;
    }

    proc:::lwp-start /execname == $$1/ {
    self->started = timestamp;
    threads_alive += 1;
    }

    proc:::lwp-exit /self->started/ {
    threads_alive -= 1;
    if (threads_alive == 0) {
    exit(0);
    }
    }

    但是,这不起作用,因为 threads_alive是一个标量变量,因此它不是多 CPU 安全的。结果,多个线程将覆盖彼此对变量的更改。

    我也尝试过使用聚合变量:
    @thread_count = sum(1)
    //or
    @threads_entered = count();
    @threads_exitted = count();

    不幸的是,我还没有找到能够做类似 @thread_count == 0 的语法。或 @threads_started == @threads_stopped .

    最佳答案

    DTrace 没有用于执行您提议的那种线程安全数据共享的工具,但是您有一些选项,具体取决于您要执行的操作。

    如果可执行文件名称是唯一的,则可以使用 proc:::startproc:::exit分别探测第一个线程的开始和最后一个线程的退出:

    proc:::start
    /execname == $$1/
    {
    my_pid = pid;
    }

    proc:::exit
    /pid == my_pid/
    {
    exit(0);
    }

    如果您使用的是 -c选项 dtrace , BEGIN探测器在相应的 proc:::start 之后很快触发.内部, dtrace -c启动指定的分支指定的命令,然后在以下四个点之一开始跟踪: exec (在新程序的第一条指令之前), preinit (在 ld 加载了所有库之后), postinit (在每个库的 _init 运行之后),或 main (就在程序 main 函数的第一条指令之前,尽管 macOS 不支持)。

    如果您使用 dtrace -x evaltime=exec -c <program> BEGIN将在程序的第一条指令执行之前触发:
    # dtrace -xevaltime=exec -c /usr/bin/true -n 'BEGIN{ts = timestamp}' -n 'pid$target:::entry{printf("%dus", (timestamp - ts)/1000); exit(0); }'
    dtrace: description 'BEGIN' matched 1 probe
    dtrace: description 'pid$target:::entry' matched 1767 probes
    dtrace: pid 1848 has exited
    CPU ID FUNCTION:NAME
    10 16757 _dyld_start:entry 285us

    285us 是由于需要的时间 dtrace通过 /proc 恢复进程或 ptrace(2)在 macOS 上。而不是 proc:::startproc:::lwp-start您也许可以使用 BEGIN , pid$target::_dyld_start:entry , 或 pid$target::main:entry .

    关于macos - 您能否在 DTrace 中以多 CPU 安全的方式比较探针之间的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62068451/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com