Как использовать опцию -V в тесте perf? - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь напечатать значение переменной в указанной функции c, используя perf. Поэтому я попытался выполнить тест с параметром -V, но я получил сообщение об ошибке, подобное этому.

# perf probe -V tcp_sendmsg
Failed to find the path for the kernel: Invalid ELF file
  Error: Failed to show vars.

Итак, я загрузил символьный пакет с ядром и пакет с исходным кодом и проверил значение CONFIG_DEBUG_INFO в /boot/config-5.3. 0-46-generi c 'установлен на 1. Но все равно возникает та же ошибка.

Как мне исправить эту проблему?

Ubuntu 18.04 LTS release: 5.3.0-46- общая версия: 38 ~ 18.04.01

1 Ответ

1 голос
/ 03 мая 2020

Чтобы заставить perf probe -V работать, вам нужно будет передать файл vm linux с debuginfo, который, как вы, похоже, сделали в соответствии с вашим комментарием -

sudo perf probe --vmlinux /usr/lib/debug/boot/vmlinux-4.15.0-1077-azure 
-V tcp_sendmsg
Available variables at tcp_sendmsg
        @<tcp_sendmsg+0>
                size_t  size
                struct msghdr*  msg
                struct sock*    sk

Теперь, согласно человеку -page, perf probe -L означает

-L, --line=
    Show source code lines which can be probed. 
    This needs an argument which specifies a range of the source code. 
    (see LINE SYNTAX for detail) 

, что означает, что вам нужно указать местоположение исходного кода ядра, когда вы запускаете perf probe -L, в противном случае инструмент elfutils, который анализирует vm linux файл с debuginfo не сможет определить правильный путь для исходных текстов ядра.

Вы можете скачать исходные коды ядра, как указано здесь

И затем запустить perf probe где вы указываете переключатель --source,

sudo perf probe --source /usr/src/linux-source-4.4.0 --vmlinux /usr/lib/debug/boot/vmlinux-4.15.0-1077-azure -L tcp_sendmsg
<tcp_sendmsg@/usr/src/linux-source-4.4.0//net/ipv4/tcp.c:0>
      0         /* Clear memory counter. */
      1         tp->ucopy.memory = 0;
         }

      4  static struct sk_buff *tcp_recv_skb(struct sock *sk, u32 seq, u32 *off)
      5  {
      6         struct sk_buff *skb;
                u32 offset;

      9         while ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) {
                        offset = seq - TCP_SKB_CB(skb)->seq;
                        if (TCP_SKB_CB(skb)->tcp_flags & TCPHDR_SYN)
                                offset--;
...