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
提供程序来跟踪entry
和return
探测?
例如
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 提供程序是不是仅适用于调试模式编译的程序?的主要内容,如果未能解决你的问题,请参考以下文章