本文地址:https://www.ebpf.top/post/ftrace_tools

TLDR,建议收藏,需要时查阅。

如果你只是需要快速使用工具来进行问题排查,包括但不限于函数调用栈跟踪、函数调用子函数流程、函数返回结果,那么推荐你直接使用 BCC traceBrendan Gregg 封装的 perf-tools 工具即可,本文尝试从手工操作 Ftrace 跟踪工具的方式展示在底层是如何通过 tracefs 实现这些能力的。如果你对某个跟踪主题感兴趣,建议直接跳转到相关的主题查看。

快速说明:

  • kprobe 为内核中提供的动态跟踪机制,/proc/kallsym 中的函数几乎都可以用于跟踪,但是内核函数可能随着版本演进而发生变化,为非稳定的跟踪机制,数量比较多。
  • uprobe 为用户空间提供的动态机制;
  • tracepoint 是内核提供的静态跟踪点,为稳定的跟踪点,需要研发人员代码编写,数量有限;
  • usdt 为用户空间提供的静态跟踪点 【本次暂不涉及】

Ftrace 是 Linux 官方提供的跟踪工具,在 Linux 2.6.27 版本中引入。Ftrace 可在不引入任何前端工具的情况下使用,让其可以适合在任何系统环境中使用。

Ftrace 可用来快速排查以下相关问题:

  • 特定内核函数调用的频次 (function)
  • 内核函数在被调用的过程中流程(调用栈) (function + stack)
  • 内核函数调用的子函数流程(子调用栈)(function graph)
  • 由于抢占导致的高延时路径等

Ftrace 跟踪工具由性能分析器(profiler)和跟踪器(tracer)两部分组成:

  • 性能分析器,用来提供统计和直方图数据(需要 CONFIG_ FUNCTION_PROFILER=y)

    • 函数性能分析
    • 直方图
  • 跟踪器,提供跟踪事件的详情:
    • 函数跟踪(function)
    • 跟踪点(tracepoint)
    • kprobe
    • uprobe
    • 函数调用关系(function_graph)
    • hwlat 等

除了操作原始的文件接口外,也有一些基于 Ftrace 的前端工具,比如 perf-tools 和 trace-cmd (界面 KernelShark)等。整体跟踪及前端工具架构图如下:

图片来自于 《Systems Performance Enterprise and the Cloud 2nd Edition》 14.1 P706

Ftrace 的使用的接口为 tracefs 文件系统,需要保证该文件系统进行加载:

$ sysctl -q kernel.ftrace_enabled=1
$ mount -t tracefs tracefs /sys/kernel/tracing $ mount -t debugfs,tracefs
tracefs on /sys/kernel/tracing type tracefs (rw,nosuid,nodev,noexec,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime)
tracefs on /sys/kernel/debug/tracing type tracefs (rw,nosuid,nodev,noexec,relatime) $ ls -F /sys/kernel/debug/tracing # 完整目录如下图

tracing 目录下核心文件介绍如下表格,当前可仅关注黑体加粗的项,其他项可在需要的时候再进行回顾:

文件 描述
available_tracers 可用跟踪器,hwlat blk function_graph wakeup_dl wakeup_rt wakeup function nop,nop 表示不使用跟踪器
current_tracer 当前使用的跟踪器
function_profile_enabled 启用函数性能分析器
available_filter_functions 可跟踪的完整函数列表
set_ftrace_filter 选择跟踪函数的列表,支持批量设置,例如 *tcp、tcp* 和 *tcp* 等
set_ftrace_notrace 设置不跟踪的函数列表
set_event_pid 设置跟踪的 PID,表示仅跟踪 PID 程序的函数或者其他跟踪
tracing_on 是否启用跟踪,1 启用跟踪 0 关闭跟踪
trace_options 设置跟踪的选项
trace_stat(目录) 函数性能分析的输出目录
kprobe_events 启用 kprobe 的配置
uprobe_events 启用 uprobe 的配置
events ( 目录 ) 事件(Event)跟踪器的控制文件: tracepoint、kprobe、uprobe
trace 跟踪的输出 (Ring Buffer)
trace_pipe 跟踪的输出;提供持续不断的数据流,适用于程序进行读取

perf_tools 包含了一个复位所有 ftrace 选型的工具脚本,在跟踪不符合预期的情况下,建议先使用 reset-ftrace 进行复位,然后再进行测试。

1. 内核函数调用跟踪

基于 Ftrace 的内核函数调用跟踪整体架构如下所示:

图片来自于 《Systems Performance Enterprise and the Cloud 2nd Edition》 14.4 P713

这里我们尝试对于内核中的系统调用函数 __arm64_sys_openat 进行跟踪(前面两个下划线),需要注意的是 __arm64_sys_openat 是在 arm64 结构体系下 sys_openat 系统调用的包装,如果在 x86_64 架构下则为 __x64_sys_openat() ,由于我们本地的电脑是 M1 芯片,所以演示的样例以 arm64 为主。

在不同的体系结构下,可以在 /proc/kallsym 文件中搜索确认。

后续的目录,如无特殊说明,都默认位于 /sys/kernel/debug/tracing/ 根目录。

# 使用 function 跟踪器,并将其设置到 current_tracer
$ sudo echo function > current_tracer # 将跟踪函数 __arm64_sys_openat 设置到 set_ftrace_filter 文件中
$ sudo echo __arm64_sys_openat > set_ftrace_filter # 开启全局的跟踪使能
$ sudo echo 1 > tracing_on # 运行 ls 命令触发 sys_openat 系统调用,新的内核版本中直接调用 sys_openat
$ ls -hl # 关闭
$ sudo echo 0 > tracing_on
$ sudo echo nop > current_tracer # 需要主要这里的 echo 后面有一个空格,即 “echo+ 空格>"
$ sudo echo > set_ftrace_filter # 通过 cat trace 文件进行查看
$ sudo cat trace
# tracer: function
#
# entries-in-buffer/entries-written: 224/224 #P:4
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
sudo-15099 [002] .... 29469.444400: __arm64_sys_openat <-invoke_syscall
sudo-15099 [002] .... 29469.444594: __arm64_sys_openat <-invoke_syscall

我们可以看到上述的结果表明了函数调用的任务名称、PID、CPU、标记位、时间戳及函数名字。

perf_tools 工具集中的前端封装工具为 functrace ,需要注意的是该工具默认不会设置 tracing_on 为 1, 需要在启动前进行设置,即 ”echo 1 > tracing_on“。

perf_tools 工具集中 kprobe 也可以实现类似的效果,底层基于 kprobe 机制实现,ftrace 机制中的 kprobe 在后续章节会详细介绍。

2. 函数被调用流程(栈)

在第 1 部分我们获得了内核函数的调用,但是有些场景我们更可能希望获取调用该内核函数的流程(即该函数是在何处被调用),这需要通过设置 options/func_stack_trace 选项实现。

$ sudo echo function > current_tracer
$ sudo echo __arm64_sys_openat > set_ftrace_filter
$ sudo echo 1 > options/func_stack_trace # 设置调用栈选项
$ sudo echo 1 > tracing_on $ ls -hl $ sudo echo 0 > tracing_on $ sudo cat trace
# tracer: function
#
# entries-in-buffer/entries-written: 292/448 #P:4
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
sudo-15134 [000] .... 29626.670430: __arm64_sys_openat <-invoke_syscall
sudo-15134 [000] .... 29626.670431: <stack trace>
=> __arm64_sys_openat
=> invoke_syscall
=> el0_svc_common.constprop.0
=> do_el0_svc
=> el0_svc
=> el0_sync_handler
=> el0_sync # 关闭
$ sudo echo nop > current_tracer
$ sudo echo > set_ftrace_filter
$ sudo echo 0 > options/func_stack_trace

通过上述跟踪记录,我们可以发现记录同时展示了函数调用的记录和被调用的函数流程,__arm64_sys_openat 的被调用栈如下:

=> __arm64_sys_openat
=> invoke_syscall
=> el0_svc_common.constprop.0
=> do_el0_svc
=> el0_svc
=> el0_sync_handler
=> el0_sync

perf_tools 工具集中 kprobe 通过添加 ”-s“ 参数实现同样的功能,运行的命令如下:

$ ./kprobe -s 'p:__arm64_sys_openat'

3. 函数调用子流程跟踪(栈)

如果想要分析内核函数调用的子流程(即本函数调用了哪些子函数,处理的流程如何),这时需要用到 function_graph 跟踪器,从字面意思就可看出这是函数调用关系跟踪。

基于 __arm64_sys_openat 子流程调用关系的跟踪的完整设置过程如下:

# 将当前 current_tracer 设置为 function_graph
$ sudo echo function_graph > current_tracer
$ sudo echo __arm64_sys_openat > set_graph_function # 设置跟踪子函数的最大层级数
$ sudo echo 3 > max_graph_depth # 设置最大层级
$ sudo echo 1 > tracing_on $ ls -hl $ sudo echo 0 > tracing_on
#$ echo nop > set_graph_function
$ sudo cat trace
# tracer: function_graph
#
# CPU DURATION FUNCTION CALLS
# | | | | | | |
1) | __arm64_sys_openat() {
1) | do_sys_openat2() {
1) 0.875 us | getname();
1) 0.125 us | get_unused_fd_flags();
1) 2.375 us | do_filp_open();
1) 0.084 us | put_unused_fd();
1) 0.125 us | putname();
1) 4.083 us | }
1) 4.250 us | }

在本样例中 __arm64_sys_openat 函数的调用子流程仅包括 do_sys_openat2() 子函数,而 do_sys_openat2() 函数又调用了 getname()/get_unused_fd_flags() 等子函数。

这种完整的子函数调用关系,对于我们学习内核源码和分析线上的问题都提供了便利,排查问题时则可以顺藤摸瓜逐步缩小需要分析的范围。

perf_tools 工具集的前端工具为 funcgraph ,使用 funcgraph 启动命令如下所示:

$./funcgraph -m 3 __arm64_sys_openat

如果函数调用栈比较多,直接查看跟踪记录则非常不方便,基于此社区补丁 [PATCH] ftrace: Add vim script to enable folding for function_graph traces 提供了一个基于 vim 的配置,可通过树状关系来折叠和展开函数调用的最终记录,vim 设置完整如下:

" Enable folding for ftrace function_graph traces.
"
" To use, :source this file while viewing a function_graph trace, or use vim's
" -S option to load from the command-line together with a trace. You can then
" use the usual vim fold commands, such as "za", to open and close nested
" functions. While closed, a fold will show the total time taken for a call,
" as would normally appear on the line with the closing brace. Folded
" functions will not include finish_task_switch(), so folding should remain
" relatively sane even through a context switch.
"
" Note that this will almost certainly only work well with a
" single-CPU trace (e.g. trace-cmd report --cpu 1). function! FunctionGraphFoldExpr(lnum)
let line = getline(a:lnum)
if line[-1:] == '{'
if line =~ 'finish_task_switch() {$'
return '>1'
endif
return 'a1'
elseif line[-1:] == '}'
return 's1'
else
return '='
endif
endfunction function! FunctionGraphFoldText()
let s = split(getline(v:foldstart), '|', 1)
if getline(v:foldend+1) =~ 'finish_task_switch() {$'
let s[2] = ' task switch '
else
let e = split(getline(v:foldend), '|', 1)
let s[2] = e[2]
endif
return join(s, '|')
endfunction setlocal foldexpr=FunctionGraphFoldExpr(v:lnum)
setlocal foldtext=FunctionGraphFoldText()
setlocal foldcolumn=12
setlocal foldmethod=expr

将上述指令保存为 function-graph-fold.vim 文件,在 vim 使用时通过 -S 参数指定上述配置,就可实现按照层级展示跟踪记录。在 vim 中,可通过 za 展开,zc 折叠跟踪记录。(通过文件分析,我们需要在 cat trace 文件时候重定向到文件)。

$ vim -S function-graph-fold.vim trace.log

4. 内核跟踪点(tracepoint)跟踪

可基于 ftrace 跟踪内核静态跟踪点,可跟踪的完整列表可通过 available_events 查看。events 目录下查看到各分类的子目录,详见下图:

# available_events 文件中包括全部可用于跟踪的静态跟踪点
$ sudo grep openat available_events
syscalls:sys_exit_openat2
syscalls:sys_enter_openat2
syscalls:sys_exit_openat
syscalls:sys_enter_openat # 我们可以在 events/syscalls/sys_enter_openat 中查看该跟踪点相关的选项
$ sudo ls -hl events/syscalls/sys_enter_openat
total 0
-rw-r----- 1 root root 0 Jan 1 1970 enable # 是否启用跟踪 1 启用
-rw-r----- 1 root root 0 Jan 1 1970 filter # 跟踪过滤
-r--r----- 1 root root 0 Jan 1 1970 format # 跟踪点格式
-r--r----- 1 root root 0 Jan 1 1970 hist
-r--r----- 1 root root 0 Jan 1 1970 id
--w------- 1 root root 0 Jan 1 1970 inject
-rw-r----- 1 root root 0 Jan 1 1970 trigger $ sudo cat events/syscalls/sys_enter_openat/format
name: sys_enter_openat
ID: 555
format:
field:unsigned short common_type; offset:0; size:2; signed:0;
field:unsigned char common_flags; offset:2; size:1; signed:0;
field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
field:int common_pid; offset:4; size:4; signed:1; field:int __syscall_nr; offset:8; size:4; signed:1;
field:int dfd; offset:16; size:8; signed:0;
field:const char * filename; offset:24; size:8; signed:0;
field:int flags; offset:32; size:8; signed:0;
field:umode_t mode; offset:40; size:8; signed:0; print fmt: "dfd: 0x%08lx, filename: 0x%08lx, flags: 0x%08lx, mode: 0x%08lx", ((unsigned long)(REC->dfd)), ((unsigned long)(REC->filename)), ((unsigned long)(REC->flags)), ((unsigned long)(REC->mode))

这里直接使用 tracepoint 跟踪 sys_openat 系统调用,设置如下:

$ sudo echo 1 > events/syscalls/sys_enter_openat/enable
$ sudo echo 1 > tracing_on
$ sudo cat trace
# tracer: nop
#
# entries-in-buffer/entries-written: 19/19 #P:4
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
cat-16961 [003] .... 47683.934082: sys_openat(dfd: ffffffffffffff9c, filename: ffff9abf20f0, flags: 80000, mode: 0)
cat-16961 [003] .... 47683.934326: sys_openat(dfd: ffffffffffffff9c, filename: ffff9ac09f20, flags: 80000, mode: 0)
cat-16961 [003] .... 47683.935468: sys_openat(dfd: ffffffffffffff9c, filename: ffff9ab75150, flags: 80000, mode: 0) # 关闭
$ sudo echo 0 > events/syscalls/sys_enter_openat/enable

我们通过设置 sys_enter_openat/enable 开启对于 sys_enter_openat 的跟踪,trace 文件中的跟踪记录格式与 sys_enter_openat/format 中的 print 章节的格式一致。

print fmt: "dfd: 0x%08lx, filename: 0x%08lx, flags: 0x%08lx, mode: 0x%08lx" ...

Filter 跟踪记录条件过滤

关于 sys_enter_openat/filter 文件为跟踪记录的过滤条件设置,格式如下:

field operator value

其中:

  • field 为 sys_enter_openat/format 中的字段。
  • operator 为比较符
    • 整数支持:==,!=,</、,<=,>= 和 & ,
    • 字符串支持 ==,!=,~ 等,其中 ~ 支持 shell 脚本中通配符 *,?,[] 等操作。
    • 不同的条件也支持 && 和 || 进行组合。

如需要通过 format 格式中的 mode 字段过滤:

field:umode_t mode;	offset:40;	size:8;	signed:0;

只需要将进行如下设置即可:

$ sudo echo 'mode != 0' >  events/syscalls/sys_enter_openat/filter

如果需要清除 filter,直接设置为 0 即可:

$ sudo echo 0 > events/syscalls/sys_enter_openat/filter

5. kprobe 跟踪

kprobe 为内核提供的动态跟踪机制。与第 1 节介绍的函数跟踪类似,但是 kprobe 机制允许我们跟踪函数任意位置,还可用于获取函数参数与结果返回值。使用 kprobe 机制跟踪函数须是 available_filter_functions 列表中的子集。

kprobe 设置文件和相关文件如下所示,其中部分文件为设置 kprobe 跟踪函数后,Ftrace 自动创建:

  • kprobe_events

    设置 kprobe 跟踪的事件属性;

    完整的设置格式如下,其中 GRP 用户可以直接定义,如果不设定默认为 kprobes

    p[:[GRP/]EVENT] [MOD:]SYM[+offs]|MEMADDR [FETCHARGS] # 设置 probe 探测点
    r[:[GRP/]EVENT] [MOD:]SYM[+0] [FETCHARGS] # 函数地址的返回跟踪
    -:[GRP/]EVENT # 删除跟踪
  • kprobes/<GRP>/<EVENT>/enabled

    设置后动态生成,用于控制是否启用该内核函数的跟踪;

  • kprobes/<GRP>/<EVENT>/filter

    设置后动态生成,kprobe 函数跟踪过滤器,与上述的跟踪点 fliter 类似;

  • kprobes/<GRP>/<EVENT>/format

    设置后动态生成,kprobe 事件显示格式;

  • kprobe_profile

    kprobe 事件统计性能数据;

Kprobe 跟踪过程可以指定函数参数的显示格式,这里我们先给出 sys_openat 函数原型:

SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags,
umode_t, mode);

**跟踪函数入口参数 **

这里仍然以 __arm64_sys_openat 函数为例,演示使用 kpboe 机制进行跟踪:

# p[:[GRP/]EVENT] [MOD:]SYM[+offs]|MEMADDR [FETCHARGS]
# GRP=my_grp EVENT=arm64_sys_openat
# SYM=__arm64_sys_openat
# FETCHARGS = dfd=$arg1 flags=$arg3 mode=$arg4
$ sudo echo 'p:my_grp/arm64_sys_openat __arm64_sys_openat dfd=$arg1 flags=$arg3 mode=$arg4' >> kprobe_events $ sudo cat events/my_grp/arm64_sys_openat/format
name: __arm64_sys_openat
ID: 1475
format:
field:unsigned short common_type; offset:0; size:2; signed:0;
field:unsigned char common_flags; offset:2; size:1; signed:0;
field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
field:int common_pid; offset:4; size:4; signed:1; field:unsigned long __probe_ip; offset:8; size:8; signed:0; print fmt: "(%lx)", REC->__probe_ip events/my_grp/arm64_sys_openat/format
$ sudo echo 1 > events/my_grp/arm64_sys_openat/enable
# $ sudo echo 1 > options/stacktrace # 启用栈 $ cat trace
# tracer: nop
#
# entries-in-buffer/entries-written: 38/38 #P:4
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
cat-17025 [002] d... 52539.651096: arm64_sys_openat: (__arm64_sys_openat+0x0/0xb4) dfd=0xffff8000141cbeb0 flags=0x1bf mode=0xffff800011141778 # 关闭,注意需要先 echo 0 > enable 停止跟踪
# 然后再使用 "-:my_grp/arm64_sys_openat" 停止,否则会正在使用或者忙的错误
$ sudo echo 0 > events/my_grp/arm64_sys_openat/enable
$ sudo echo '-:my_grp/arm64_sys_openat' >> kprobe_events

**跟踪函数返回值 **

kprobe 可用于跟踪函数返回值,格式如下:

r[:[GRP/]EVENT] [MOD:]SYM[+offs]|MEMADDR [FETCHARGS]

例如:

$ sudo echo 'r:my_grp/arm64_sys_openat __arm64_sys_openat ret=$retval' >> kprobe_events

变量 $retval 参数表示函数返回值,其他的使用格式与 kprobe 类似。

6. uprobe 跟踪

uprobe 为用户空间的动态跟踪机制,格式和使用方式与 kprobe 的方式类似,但是由于是用户态程序跟踪需要指定跟踪的二进制文件和偏移量。

p[:[GRP/]EVENT]] PATH:OFFSET [FETCHARGS]  # 跟踪函数入口
r[:[GRP/]EVENT]] PATH:OFFSET [FETCHARGS] # 跟踪函数返回值
-:[GRP/]EVENT] # 删除跟踪点

这里以跟踪 /bin/bash 二进制文件中的 readline() 函数为例:

$ readelf -s /bin/bash | grep -w readline
920: 00000000000d6070 208 FUNC GLOBAL DEFAULT 13 readline $ echo 'p:my_grp/readline /bin/bash:0xd6070' >> uprobe_events
$ echo 1 > events/my_grp/readline/enable $ cat trace
# tracer: nop
#
# entries-in-buffer/entries-written: 1/1 #P:4
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
bash-14951 [003] .... 54570.055093: readline: (0xaaaab3ce6070) $ echo 0 > events/my_grp/readline/enable
$ echo '-:my_grp/readline' >> uprobe_events

uprobe 跟踪是跟踪用户态的函数,因此需要指定二进制文件+符号偏移量才能进行跟踪。不同系统中的二进制版本或者编译方式不同,会导致函数符号表的位置不同,因此需要跟踪前进行确认。

7. 总结

至此,我们完整介绍 Ftrace 的整体应用场景,也通过具体的设置,学习了使用的完整流程。

实际问题排查中,考虑到效率和易用性,推荐大家这样选择:

  • 如果排查问题机器上支持 eBPF技术,首选 BCC trace 及相关工具;
  • 否则推荐使用 perf-tools
  • 最后的招数就是使用本文 Ftrace 的完整流程了。

但目前基于 eBPF 的工具还未支持 function_graph 跟踪器,特定场景下还需要 ftrace 的 function_graph 跟踪器的配合。

Ftrace 与 eBPF 并非是相互替代,而是相互补充协同关系,在后续的问题排查案例中我们将看到这一点。

参考

问题排查利器:Linux 原生跟踪工具 Ftrace 必知必会的更多相关文章

  1. LINUX 必知必会检测表--通读无关语言

    一.linux和os: 1.命令:netstat tcpdump ipcs ipcrm 这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验 2.cpu 内存 硬盘 等等与系统性能调试相关的命 ...

  2. linux实用指令 | 程序员线上排查必知必会linux指令(持续更新中)

    Linux线上排查程序员实用指南 一.乱码问题 二.帮助指令 1. help命令 2. man命令 3. info命令 三.性能监测与优化 1. top命令 参考资源 Linux线上排查程序员实用指南 ...

  3. linux shell必知必会sed、awk

    sed是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往 ...

  4. Linux网络命令必知必会之瑞士军刀 nc(netcat)

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. nc,全名叫 ...

  5. 程序猿必知必会Linux命令之awk

    前言 对于一名专业的程序员来说,Linux相关知识是必须要掌握的,其中对于文本的处理更是我们常见的操作,比如格式化输出我们需要的数据,这些数据可能会来源于文本文件或管道符,或者统计文本里面我们需要的数 ...

  6. Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收!

    目录 01 简介 02 tcpdump 命令选项 03 过滤器 04 常用操作 4.1 抓取某主机的数据包 4.2 抓取某端口的数据包 4.3 抓取某网络(网段)的数据包 4.4 抓取某协议的数据包 ...

  7. Linux学习总结(9)——Linux 新手必知必会的 10 条 Linux 基本命令

    Linux 对我们的生活产生了巨大的冲击.至少你的安卓手机使用的就是 Linux 核心.尽管如此,在第一次开始使用 Linux 时你还是会感到难以下手.因为在 Linux 中,通常需要使用终端命令来取 ...

  8. 必知必会的JavaJDK工具

    JDK中有很多用于监控诊断的系统工具,对于Java程序员来说,无疑是用来了解自己程序运行时性能好坏的强大工具. 在JDK的bin目录下就可以找到这些工具. JPS 在Linux有一个命令叫做ps,可以 ...

  9. Linux必知必会--awk

    弱者,是没有资格要求公平的. --<秦时明月>卫庄 参考文献: http://www.ruanyifeng.com/blog/2018/11/awk.html 阮一峰 https://ww ...

随机推荐

  1. 浅谈VPC (转)

    来源于知乎:https://zhuanlan.zhihu.com/p/33658624 VPC全称是Virtual Private Cloud,翻译成中文是虚拟私有云.但是在有些场合也被翻译成私有网络 ...

  2. 可能用得上的UI控件

    为了便于开发者打造各式各样的优秀App,UIKit框架提供了非常多功能强大又易用的UI控件以下列举一些在开发中可能用得上的UI控件:   红色表明最常用,蓝色代表一般,黑色代表几乎不用(这不是绝对的, ...

  3. linux上printf出带颜色字体

    转载请注明来源:https://www.cnblogs.com/hookjc/ 统一定义: #define NONE         "\033[m"  #define RED   ...

  4. Java线程--CompletionService使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871911.html Java线程--CompletionService使用 public ...

  5. NoSQL 之 Redis配置与优化

    NoSQL 之 Redis配置与优化 1.关系数据库与非关系型数据库概述 2.关系数据库与非关系型数据库区别 3.非关系型数据库产生背景 4.Redis简介 5.Redis安装部署 6.Redis 命 ...

  6. LNMP架构的源码编译以及yum安装

    LNMP架构的源码编译以及yum安装 目录 LNMP架构的源码编译以及yum安装 一.LNMP架构的编译安装 1. 安装nginx服务 (1)关闭防火墙 (2)安装依赖包 (3)创建运行用户 (4)编 ...

  7. 数据库监测sql执行

    SQL Server Profiler可以检测在数据上执行的语句,特别是有的项目不直接使用sql语句,直接使用ORM框架的系统处理数据库的项目,在调试sql语句时,给了很大的帮助. 之前写了使用SQL ...

  8. MacOS常用命令行工具

    转自:https://blog.csdn.net/u014102846/article/details/77964493 https://ohmyz.sh/ https://github.com/ro ...

  9. JDBC加强

    一.使用PreparedStatement预编译语句防止SQL注入 什么是SQL注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行 ...

  10. 北京太速-611号-基于VU9P的5Gsps高速ADDA收发PCIe卡

    1    板卡概述 基于XCVU9P的5Gsps AD DA收发PCIe板卡.该板卡要求符合PCIe 3.0标准,包含一片XCVU9P-2FLGA2014I.2组64-bit/8GB DDR4.2路高 ...