我最近一直在玩ftrace来监控我系统的某些行为特征.我一直在处理通过一个小脚本打开/关闭跟踪.运行脚本后,我的系统会崩溃并自行重启.最初,我认为脚本本身可能存在错误,但我已经确定崩溃和重启是由于设置为function_graph echo
时某些跟踪器到/ sys/kernel/debug/tracing/current_tracer的结果current_tracer
.
也就是说,以下命令序列将产生崩溃/重启:
echo "function_graph" > /sys/kernel/debug/tracing/current_tracer
echo "function" > /sys/kernel/debug/tracing/current_tracer
Run Code Online (Sandbox Code Playgroud)
在上述echo
语句导致崩溃后重启,我看到很多输出内容如下:
清除孤儿inode
<inode>
我试图通过将current_tracer
function_graph中的值替换为C程序中的其他内容来重现此问题:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int openCurrentTracer()
{
int fd = open("/sys/kernel/debug/tracing/current_tracer", O_WRONLY);
if(fd < 0)
exit(1);
return fd;
}
int writeTracer(int fd, char* tracer)
{
if(write(fd, tracer, strlen(tracer)) != strlen(tracer)) {
printf("Failure writing %s\n", tracer);
return 0;
}
return 1;
}
int main(int argc, char* argv[])
{
int fd = openCurrentTracer(); …
Run Code Online (Sandbox Code Playgroud) 我想在内核启动过程中使用ftrace跟踪一个函数,function_graph
以了解它的作用,但是它不可用available_filter_functions
.
我试图将其导出EXPORT_SYMBOL()
,猜测它会使它可用,但事实并非如此.
你有解决方案吗 ?
有关信息,功能我想跟踪是persistent_ram_init_ringbuffer
和persistent_ram_early_init
在内核的Android 3.4.
我仔细阅读了文档,但没有发现任何内容,grep没有帮助更多......
谢谢
我试图trace-cmd
收集有关我看到的内核崩溃的更多信息.不幸的是,内核崩溃时出现"内核崩溃 - 不同步"消息(即套接字和文件缓冲区没有刷新,因此崩溃时缓冲区中的任何内容都不可避免地丢失).
有办法:
trace-cmd
进程将其缓冲区刷新到文件系统或套接字?要么由于我trace-cmd
在虚拟化环境中运行该命令,因此我不关心硬盘驱动器是否偶尔会损坏,因为我可以简单地恢复到最后一个良好的快照或重新部署VM.
Android systrace工具,通过ADB 调用atrace工具.但是,我不太了解跟踪文件的格式.显然它与linux ftrace工具非常相似,但有些不同.主要区别在于它不使用System.Map文件,但它将所有信息包含在跟踪文件中.此外,还有一些特定于Android的新B | E条目.
Android源代码中有关于此格式的一些信息,请访问:http://androidxref.com/4.1.1/xref/external/chromium-trace/src/tracing/linux_perf_importer.js
但是,在该文档中,我们可以读到该格式属于Linux Perf Tool.我不这么认为,linux perf作为输出提供了一种非常不同的格式......(除非某些特殊配置是活动的......)
我的问题是:有谁知道我在哪里可以找到关于使用adb的atrace工具生成的android跟踪文件的官方文档?
这种格式对你来说很熟悉吗?
# tracer: nop
#
# entries-in-buffer/entries-written: 66427/66427 #P:2
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
atrace-1724 [000] d..3 14186.680000: sched_switch: prev_comm=atrace prev_pid=1724 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120 …
Run Code Online (Sandbox Code Playgroud) Linux的性能计数器是一个新的基于内核的子系统,它为所有事物性能分析提供了框架.它还包括硬件级别(CPU/PMU,性能监视单元)功能和软件功能(软件计数器,跟踪点).从2.6.33开始,内核为开发人员提供'perf_event_create_kernel_counter'内核api,以创建内核计数器来收集系统运行时信息.我最关心的是启用tracepoint/ftrace时对整个系统的性能影响.我找不到关于它们的文档.我曾经被告知ftrace是通过动态修补代码实现的,它会大大减慢系统速度吗?
如何使用ftrace()(或其他任何东西)跟踪Linux内核中特定的用户定义函数?我正在尝试创建和运行一些微基准测试,所以我希望有时间运行某些功能.我已经阅读了(至少尽可能多的)文档,但朝着正确方向迈出的一步将是非常棒的.
我倾向于ftrace(),但在Ubuntu 14.04上有问题.
目标是检查任何进程传递给特定系统调用(例如exec,open等)的参数.
从官方文档中,没有描述记录函数参数的能力(主要看"函数"跟踪器,因为我不需要图形).
如果我能在ftrace的框架内实际做到这一点,我想确保我不会忽视某些东西并浪费时间使用更具异国情调的东西.
我刚刚读到2.6.27内核有一个名为ftrace的新模块,听起来很像suns dtrace实用程序.我在搜索文档时遇到了一些麻烦,我想知道是否还有其他人有什么东西.这是什么东西将在完整的编程堆栈上实现,如dtrace,我们将获得一个很好的小脚本语言在Linux中进行跟踪?
对于冗长的帖子道歉,我在以较短的方式制定它时遇到了麻烦.此外,这可能更适合Unix和Linux Stack Exchange,但我会先在SO处尝试,因为有一个ftrace
标签.
无论如何 - 我想观察用户程序的机器指令是否在完全function_graph
捕获的上下文中执行ftrace
.一个问题是我需要这个旧内核:
$ uname -a
Linux mypc 2.6.38-16-generic #67-Ubuntu SMP Thu Sep 6 18:00:43 UTC 2012 i686 i686 i386 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
......在这个版本中,没有UPROBES
- 正如3.5 [LWN.net]中的Uprobes应该能够做到这一点.(只要我不需要修补原始内核,我就会愿意尝试使用树构建的内核模块,因为User-Space Probes(Uprobes)[chunghwan.com]似乎可以证明;但是至于我可以从0看到:基于Inode的uprobes [LWN.net],2.6可能需要一个完整的补丁)
但是,在这个版本上,有一个/sys/kernel/debug/kprobes
,和/sys/kernel/debug/tracing/kprobe_events
; 和Documentation/trace/kprobetrace.txt意味着可以直接在地址上设置kprobe; 即使我无法在任何地方找到如何使用它的例子.
在任何情况下,我仍然不确定使用什么地址 - 作为一个小例子,假设我想跟踪程序main
功能的开始wtest.c
(包括在下面).我可以这样做来编译并获得一个机器指令汇编列表:
$ gcc -g -O0 wtest.c -o wtest
$ objdump -S wtest | less
...
08048474 <main>:
int …
Run Code Online (Sandbox Code Playgroud) 在Linux内核中提供kprobe事件支持ftrace时使用跟踪点事件的用例有哪些?似乎可以使用"跟踪点事件"使用kprobe事件完成所有可能的事情,因为可以在跟踪点事件可用的同一点设置kprobe事件.
我错过了什么吗?