我不确定我是否以正确的方式思考这个问题(如果我错了,请纠正我),但以下是我对 ftrace 的理解。
在/sys/kernel/debug/tracing中,有以下文件:
set_ftrace_filter
这只会跟踪里面列出的功能,
set_ftrace_notrace
这只会跟踪里面没有列出的功能,和
set_ftrace_pid
它只会跟踪带有 pid 内部的进程。
我的问题是:有没有办法配置它,以便 ftrace 只跟踪没有特定 pid(或进程名称)的进程?
比喻:
set_ftrace_filter : set_ftrace_notrace :: set_ftrace_pid : x
x是否存在,如果存在,我该如何使用它?
例如,如果我想跟踪除 pid 为 48 的进程之外的所有进程,是否有某种方法可以将不是 48 的内容放入 set_ftrace_pid 中?
我一直在阅读文档并在网上搜索,但我找不到实现这一目标的方法或这是否可行。
为什么我这样做:我有一个跟踪内核级系统调用的程序,但我想将程序的 pid(以及它的子进程的 pid,如果有必要的话)写入过滤器,这样它们就不会包含在跟踪数据。读取跟踪时,我可以在读取每个跟踪记录时检查 pid 并决定是否使用该记录,但如果有办法避免它,我不希望为读取的每个记录添加此开销。
感谢您的时间!
我知道我可以将xtrace
输出重定向到some_file
以下内容:
exec 2 >> some_file
set +x
Run Code Online (Sandbox Code Playgroud)
...但这some_file
不仅会发送到xtrace
输出,还会发送到最初发送到 的任何其他内容fd 2
,其中包括大多数错误消息和警告,都与 无关xtrace
。
有没有办法只捕获 中的xtrace
输出some_file
?
我应该补充一点,我正在寻找一种方法来做到这一点,尽可能少地扭曲xtrace
输出本身,以及通过PS4
设置收集的时间信息,例如
zmodload zsh/datetime
export PS4='${(j::)epochtime} %N:%i> '
Run Code Online (Sandbox Code Playgroud) 我有一个 bash 脚本myscript.sh
,里面有很多函数。要运行一个函数,我会写
source myscript.sh; myfunction
Run Code Online (Sandbox Code Playgroud)
如何调试这样的功能?
我正在开发通过直接内存访问 (DMA) 事务与 PCI 卡通信的软件。我的程序使用一套驱动程序和一个处理 DMA 的库。一切都在 Red Hat Linux 上运行。
为了测试和测量我的程序的性能,我想跟踪 DMA 事务的开始和结束。现在我通过查看库中的几个函数来做到这一点:
dma_from_host
并dma_to_host
通过配置卡寄存器中的值并写入1
名为的寄存器来启动事务DMA_DESC_ENABLE
dma_wait
通过不断检查DMA_DESC_ENABLE
寄存器的值来等待事务完成。但我想要更可靠的确认交易已经开始,并在交易结束时获得更精确的信号。来自 Linux 或硬件本身的东西是最好的。
我知道原则上这是一个麻烦的情况。DMA 的思想是硬件(PCI 卡或主板上的 DMA 控制器)将事物直接复制到进程的内存中,绕过 CPU 和操作系统。但我希望它不会只是将内容复制到 RAM 中而不以某种方式通知 CPU。是否有一些标准方法来跟踪这些交易,或者它是非常特定于平台的?
是否有一些特殊的中断通知 CPU DMA 的开始和结束?我在我使用的驱动程序中找不到类似的东西。但我对司机没有经验,所以我很容易看错地方。
另一个想法,是否有任何类似 PMU 的硬件监视器可以提供这些信息?只计算 PCI 通道上的事务的东西?
还有一个想法,我是否理解可以将自定义 DMA 跟踪器编写为 Linux 模块或 BPF 程序来连续检查该DMA_DESC_ENABLE
寄存器的值?这是一种可行的方法吗?有这样的已知示踪剂吗?
在 bash 脚本中,我有一个log()
在多个地方使用的logs()
函数,以及一个将大量行转移到log()
. 当我运行该脚本的部分set -x
,显然内的所有命令logs()
和log()
被跟踪了。
我想定义logs()
并且log()
至少他们的内容,最多甚至他们的呼叫被禁止set -x
输出。
tracing ×5
bash ×2
debugging ×2
linux ×2
audit ×1
ftrace ×1
function ×1
monitoring ×1
performance ×1
process ×1
system-calls ×1
zsh ×1