我在OS X Yosemite 10.10.5上。我有一个用Rust编写的库,我需要衡量在该库中花费的运行时间。我设置了一些像这样的pid探针(不是实际的脚本):

pid$target::*parse*:entry
{
}

pid$target::*parse*:return
{
}

pid$target::*re_match*:entry
{
}

pid$target::*re_match*:return
{
}

相应的测试代码如下:
let xxx = xxx_of_len(10);
let m = re_match(RE_XXX, &xxx).unwrap();
println!("{:?}", m);

我的库中re_match函数的实现是:
pub fn re_match(re: &str, s: &str) -> Result<MatchResult, Error> {
    let prog = Compiler::compile(&Parser::parse(re)?)?;
    let mut vm = Vm::new(&prog);
    if vm.run(&s.chars().collect()) {
        return Ok(MatchResult::Match(vm.groups.clone()));
    }
    Ok(MatchResult::NotMatch)
}

问题是,当return探针正常工作时,无法触发两个entry探针。另外,如果我以相同的方式为entry函数设置returnCompile::compile探针,则这两个探针都可以工作。

那么,这个问题可能是什么原因造成的,我应该如何解决呢?

最佳答案

根据Brendan Gregg's blog post的说法,问题可能是由编译器优化引起的,其中DTrace被优化的代码所混淆,因此它无法创建某些return探针。要关闭优化,我们可以将以下内容添加到测试程序的Cargo.toml中:

[profile.release]
opt-level = 0

完成此操作后,我可以使用命令找到所需的return探针:
sudo dtrace -l -n 'pid$target:::return' -c './path/to/test/binary'

09-05 11:51