Systemtap не показывает все локальные переменные в функции ядра
Я пытаюсь отладить некоторый код в ядре с помощью systemtap. Мне нужно напечатать значение локальных переменных в этой функции, но похоже, что systemtap может видеть только аргументы функции, а не локальные переменные, определенные в этой функции. Вот мой сценарий исследования.
probe kernel.function("tcp_write_xmit") {
if( execname() == "bw_client"){
printf(
"tcp_write_xmit skb len %d\n",
$skb
);
}
}
Когда я запускаю это, я получаю следующую ошибку
semantic error: failed to retrieve location attribute for 'skb'
[man error::dwarf] (dieoffset: 0x5bd30b4): identifier
'$skb' at /home/cca-user/systaptest/txprobe.stp:37:6
source: $skb
^
Pass 2: analysis failed. [man error::pass2]
Однако функция tcp_write_xmit
явно имеет skb
С использованием -L
опция для печати доступных переменных дает мне 5 переменных, которые являются аргументами функции, но ни одна из локальных переменных не видна.
root@i-sahmed-node2: /mnt/linux-3.13.0 # stap -L
'kernel.function("tcp_write_xmit")'
kernel.function("tcp_write_xmit@/build/buildd/linux-3.13.0/net/ipv4
/tcp_output.c:1832") $sk:struct sock* $mss_now:unsigned int $nonagle:int
$push_one:int $gfp:gfp_t
Вот ядро и версия systemtap, которую я использую
root@i-sahmed-node2: /mnt/linux-3.13.0 # stap --version
Systemtap translator/driver (version 2.3/0.158, Debian version 2.3-1ubuntu1 (trusty))
Copyright (C) 2005-2013 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
enabled features: AVAHI LIBSQLITE3 NSS TR1_UNORDERED_MAP NLS
root@i-sahmed-node2: /mnt/linux-3.13.0 # uname -a
Linux i-sahmed-node2 3.13.0-53-generic #89-Ubuntu SMP Wed May 20 10:34:39 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Есть идеи?
3 ответа
Вы используете зонд .function. В этом тесте видны только параметры, переданные в функции. Если вам нужно проверить локальную переменную, вам нужно использовать .statement probe.
Если вам нужно проверить локальную переменную, вам нужно использовать
.statement
зонд. Пример приведен ниже:
# script
$ cat trace_statement.stp
probe kernel.statement("*@kernel/events/core.c:11758") {
printf("func name: %s\n\n", ppfunc())
printf("local variables: %s\n\n", $$locals)
printf("pretty print pmu structure: %s\n\n", $pmu$)
//printf("%s\n", kernel_string(@var("pmu")->name))
printf("pmu name field: %s\n\n", $pmu->name$)
}
# output
$ stap trace_statement.stp
func name: __do_sys_perf_event_open
local variables: group_leader=? output_event=0x0 event=0xffff001803fa6000 sibling=? attr={...} ctx=? gctx=? event_file=0x0 group={...} task=? pmu=0xffff0008025d6000 event_fd=0x3 move_group=0x0 err=? f_flags=0x80002 cgroup_fd=?
pretty print pmu structure: {.entry={...}, .module=0x0, .dev=0xffff0008025d6c00, .attr_groups=0xffff0008025d6270, .attr_update=0x0, .name="armv8_pmuv3", .type=8, .capabilities=64, .pmu_disable_count=0xffff8000113c6628, .pmu_cpu_context=0xffff8000113c6630, .exclusive_cnt={...}, .task_ctx_nr=0, .hrtimer_interval_ms=4, .nr_addr_filters=0, .pmu_enable=0xffff8000108c9f30, .pmu_disable=0xffff8000108c9e70, .event_init=0xffff8000108c9c64, .event_mapped=0x0, .event_unmapped=0x0, .add=0xffff8000108ca1c0, .del=0xffff8000108ca600, .start=0xffff8
pmu name field: "armv8_pmuv3"
probe kernel.statement("*@kernel/events/core.c:11758")
файл ядра зондов
core.c
в строке 11756.
включает каждую переменную в область видимости в точке проверки и
$$locals
расширяется до подмножества
$$vars
содержащий только локальные переменные.
Мы можем получить доступ к локальной переменной
pmu
прямо по названию. В
$
суффикс можно использовать для красивой печати структуры данных.
В
->
Оператор можно объединить в цепочку для просмотра структур данных, содержащихся в структурах данных, и отслеживания указателей на другие структуры данных. Поэтому мы используем
$pmu->name
получить доступ
name
поле структуры данных.
Вы можете обратиться к https://sourceware.org/systemtap/SystemTap_Beginners_Guide/, чтобы увидеть более подробную информацию.
Пытаться stap -L 'kernel.statement("tcp_write_xmit@*:*")'
чтобы увидеть, какие операторы и переменные по-прежнему сохраняются в вашем debuginfo. Убедитесь, что ваше ядро не мешает gcc с такими вредными вещами, как KCFLAGS += -fno-var-tracking-assignments
,