SystemTap, кажется, дает несоответствующий вывод - PullRequest
0 голосов
/ 13 июня 2018

Моя система - Ubuntu, uname -r = 4.15.0-23-generic.Я установил символы отладки для ядра.

Моя проблема:


Я пытаюсь использовать socket(AF_PACKET, SOCK_DGRAM, 0) для целей передачи.Для sendto(fd, 0,0,0,0,0) системного вызова у меня есть EINVAL (неверный аргумент), и я пытаюсь выяснить, в чем причина.


Поэтому, чтобы выяснить, что возвращает EINVAL IЯ использую SystemTap.Приведенный ниже скрипт отслеживает оператор выполнения с помощью оператора tpacket_snd.

моей тестовой программы: info.stp

probe kernel.statement("tpacket_snd@*:*") {
    tokenize(pp(),"@");
    printf("HIT %s\n", tokenize("","@"))
}

А вот вывод sudo stap info.stp для моей реализации такой передачи:

HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2619")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2627")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2628")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2636")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2638")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2640")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2641")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2656")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2659")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2658")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2662")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2663")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2669")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2671")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2674")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2672")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2675")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2680")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2688")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2692")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2694")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2693")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2706")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2710")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2707")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2708")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2709")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2712")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2743")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2728")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2736")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2735")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2785")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2787")
HIT /build/linux-uT8zSN/linux-4.15.0/net/packet/af_packet.c:2789")

[https://elixir.bootlin.com/linux/v4.15/source/net/packet/af_packet.c#L2618]


Мой вопрос: этот вывод не имеет значения (не соответствует) с исходным кодом,потому что:

  1. Во-первых, указано, что строка af_packet.c: 2707 была выполнена после того, как 2710 2710 не содержит инструкции перехода.

Во-вторых, из моего исследования я мог бы заключить это условие: [строки 2741-2745]

if (po-> has_vnet_hdr && virtio_net_hdr_to_skb (skb, vnet_hdr, vio_le ())) {tp_len =-EINVAL;goto tpacket_error;}

было оценено как истинное замечание, что SystemTap указывает, что строка 2743 была выполнена.Но, с другой стороны, я исследовал с помощью SystemTap, что po->has_vnet_hdr равен 0, поэтому невозможно выполнить if body.Тем не менее, SystemTap указывает на это.

Мой вопрос:

Как его починить или что я делаю неправильно?

1 Ответ

0 голосов
/ 04 августа 2018

Q1: Питер совершенно прав.После оптимизации компилятора строки исходного кода могут казаться выполненными в нелинейной последовательности, так как инструкции различных операторов Си смешаны.Это не представляет проблемы.

Q2: Чтобы выяснить, какой оператор вызвал возвращение -EINVAL, я бы скомбинировал пробники операторов (как и у вас, за исключением печати $$vars для просмотра локальных переменных) И функция .call / .return пара зондов, чтобы отметить, когда функция остается.Последние несколько строк трассировки операторов перед возвратом будут там, где я буду искать причину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...