【问题标题】:Does ftrace allow capture of system call arguments to the Linux kernel, or only function names?ftrace 是否允许捕获 Linux 内核的系统调用参数,还是只允许捕获函数名?
【发布时间】:2015-02-20 21:50:43
【问题描述】:

目标是检查任何进程传递给特定系统调用(例如 exec、open 等)的参数。

来自official documentation,没有描述记录函数参数的能力(主要看“函数”跟踪器,因为我不需要图表)。

如果我真的可以在 ftrace 的框架内做到这一点,我想确保我不会忽略某些东西并浪费时间使用更奇特的东西。

【问题讨论】:

  • 如果您只是在寻找来自用户空间的系统调用及其参数,那么您需要简单的用户空间实用程序strace

标签: linux-kernel trace ftrace


【解决方案1】:

我对@9​​87654323@ 的经验有限,尽管我已将它用于函数堆栈跟踪和延迟问题。 (有更多经验的人可以建议)使用trace-cmdkernelshark的体验几乎相同。

但是,如果您想在内核空间内跟踪系统调用、函数参数、内核 API 和返回值等,更好的选择是使用 systemtap。它有一个广泛的Samples & Doc 列表,这对于函数调用跟踪、传递的参数值等很有用。您可能想查看一些示例并根据您的要求定制它们。见general/para-callgraph-verbose.stpprocess/sleeptime.stp

"

general/para-callgraph-verbose.stp - 带有详细参数的调用图跟踪 关键字:TRACE CALLGRAPH

打印一个定时的每线程微秒定时调用图,包含漂亮打印的函数参数和返回值。第一个参数命名要跟踪的函数探针点。可选的第二个参数命名触发器函数的探测点,它的作用是仅跟踪当前线程嵌套在触发器中时发生的那些函数。

stap para-callgraph-verbose.stp 'kernel.function("*@fs/proc*.c")' \
'kernel.function("vfs_read")' -c "cat /proc/sys/vm/* || true"

process/strace.stp - 跟踪系统调用 关键字:_BEST PROCESS SYSCALL

当应用于单个进程或层次结构(通过 -c/-x)或整个系统(没有 -c/-x)时,该脚本松散地模拟 strace。可以使用 -G 设置一些输出配置参数。

stap strace.stp -c "sleep 1"

"

请注意,您需要安装正确版本的 debug kernelkernel-devel rpms/deb 才能使 stap 正常工作。为此,只需使用 stap-prep 并根据您使用的风格安装显示的依赖项。

【讨论】:

  • 跟踪系统调用变得更简单:sourceware.org/systemtap/examples/#process/strace.stp - 不需要内核调试符号,例如
  • @fche 感谢您的更新。 strace.stp 在我的 systemtap-examples 版本中不可用。我会更新线程。
  • (通常包含在更高版本的 stap 中的示例在早期版本中运行良好。)
【解决方案2】:

试一试“STRACE”。它监控用户空间和内核之间的交互。

可以在此处找到示例输出: http://www.thegeekstuff.com/2011/11/strace-examples/

另外,由于您说的是特定的系统调用,我假设您只对其中的几个感兴趣。

如果您必须单独使用 FTRACE,您可以在 include/trace/events/.h 的相关头文件中添加自己的跟踪事件,使用 TRACE_EVENT 宏并在内核内部的系统调用处理程序期间调用这个新的跟踪函数.

当然,这需要修改一些代码,但应该很容易让您快速上手。

【讨论】:

  • 投反对票,因为 strace 查看一个特定进程,而我正在寻找一种查看系统上所有进程的工具。
猜你喜欢
  • 2017-06-30
  • 2017-06-22
  • 1970-01-01
  • 2022-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多