DTrace pid 提供程序是不是仅适用于调试模式编译的程序?

Posted

技术标签:

【中文标题】DTrace pid 提供程序是不是仅适用于调试模式编译的程序?【英文标题】:Does the DTrace pid provider only work for debug mode compiled programs?DTrace pid 提供程序是否仅适用于调试模式编译的程序? 【发布时间】:2019-09-12 20:04:25 【问题描述】:

我想使用 DTrace 跟踪各种程序中的 FFI 使用情况。

DTrace 设计用于生产环境,但大多数软件都是通过编译器优化进行编译和分发的。

这些优化是否会阻止使用pid 提供程序来跟踪entryreturn 探测?

例如

pid$target::example_ffi_fn_x:entry pid$target::example_ffi_fn_x:return

http://dtrace.org/guide/dtrace-ebook.pdf#page=291

当编译器内联一个函数时,pid 提供者的探针会 不火。要避免在编译时内联函数,请参阅 编译器的文档。

这是否意味着您只能在发布 USDT 探针或在调试模式下编译(没有优化)的程序上使用 DTrace?

在我没有原始源代码的程序中,是否有其他方法可以跟踪 FFI 的使用情况?

【问题讨论】:

【参考方案1】:

编译器优化不会妨碍 DTrace 在大多数情况下跟踪函数的能力。是的,激进(或显式)内联会使函数不可见,但幸运的是,这种情况并不常见。二进制文件中一个更典型的挑战是缺少符号信息,无法让您找到您可能感兴趣的函数。

我很确定我记录了这一点,但我找不到它——它肯定在代码中:pid 提供程序允许您在进程的地址空间内指定指令地址。现在,它似乎在 macOS 10.15.2(我正在测试它)中被巧妙地破坏了,但它看起来像这样:dtrace -n 'pid11118::-:0x103c87a19'

【讨论】:

以上是关于DTrace pid 提供程序是不是仅适用于调试模式编译的程序?的主要内容,如果未能解决你的问题,请参考以下文章

dtrace 影响,监控进程 (OS X)?

在 Oracle Linux 上使用 DTrace

GCM 推送通知仅适用于调试 apk

Visual Studio 断点仅适用于第二次调试尝试

dtrace 将在将来运行的用户进程

与命令行相比,来自 C 的 Dtrace 不会产生相同的分析结果