我在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
函数设置return
和Compile::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'