作者
pengdonglin137@163.com
正文
uftrace专门用来跟踪用户态的C/C++以及Rust程序的执行,此外它也支持跟踪内核函数。
前一篇文章bpf_func_id是如何产生的?是以minimal为例,下面用uftrace跟踪一下执行流。为了可以让uftrace更好的工作,需要对Makefile稍加修改,给GCC加入-pg
编译选项,用GCC编译的程序是bpf的用户态程序以及libbpf库,此外,libbpf默认使用的是-O2
编译优化等级,有些函数会被内敛掉,对于分析跟踪日志有些不便,可以改成-O0
,下面是修改方法:
对examples/c/Makefile的修改
diff --git a/examples/c/Makefile b/examples/c/Makefile index 736750e..dca492e 100644 --- a/examples/c/Makefile +++ b/examples/c/Makefile @@ -21,7 +21,7 @@ VMLINUX := ../../vmlinux/$(ARCH)/vmlinux.h # libbpf to avoid dependency on system-wide headers, which could be missing or # outdated INCLUDES := -I$(OUTPUT) -I../../libbpf/include/uapi -I$(dir $(VMLINUX)) -I$(LIBBLAZESYM_INC) -CFLAGS := -g -Wall +CFLAGS := -g -O0 -Wall -pg ALL_LDFLAGS := $(LDFLAGS) $(EXTRA_LDFLAGS)
对libbpf的修改
diff --git a/src/Makefile b/src/Makefile index 35c5724..1b95a6e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -34,7 +34,7 @@ ALL_CFLAGS := $(INCLUDES) SHARED_CFLAGS += -fPIC -fvisibility=hidden -DSHARED -CFLAGS ?= -g -O2 -Werror -Wall -std=gnu89 +CFLAGS ?= -g -pg -O0 -Werror -Wall -std=gnu89 ALL_CFLAGS += $(CFLAGS) \ -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \ -Wno-unknown-warning-option -Wno-format-overflow \
修改完毕后,clean掉然后重新编译。
用uftrace进行跟踪,同时-a
开启自动探测函数参数以及返回值的功能:
# uftrace record -a --no-event ./minimal # uftrace replay
下面是输出的日志:
minimal程序的跟踪日志
下面是fentry执行的跟踪日志: