我想使用 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
When the compiler inlines a function, the pid provider’s probe does not fire. To avoid inlining a function at compile time, consult the documentation for your compiler.
这是否意味着您只能在发布 USDT 探针或在 Debug模式下编译(未经优化)的程序上使用 DTrace?
是否有另一种方法可以跟踪我没有原始源代码的程序中的 FFI 使用情况?
最佳答案
编译器优化在很大程度上不会妨碍 DTrace 跟踪函数的能力。是的,积极的(或显式的)内联会使函数不可见,但幸运的是这种情况并不常见。二进制文件中一个更典型的挑战是缺乏符号信息,无法让您找到您可能感兴趣的函数。
我很确定我记录了这一点,但我找不到它——它肯定在代码中:pid 提供程序允许您在进程的地址空间内指定指令地址。现在,它似乎在 macOS 10.15.2 中被巧妙地破坏了(我正在测试它),但它看起来像这样:dtrace -n 'pid11118::-:0x103c87a19'
关于dtrace - DTrace pid 提供程序仅适用于 Debug模式编译的程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57913806/