Как получить параметр функции ядра и привести пустой указатель на char в SystemTap? - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть системный скрипт, который проверяет функцию ядра "memcpy".Я хочу напечатать трассировку стека на основе содержимого буфера src, который является пустым указателем.

Мой код:

%{
        #include <linux/string.h>
%}
probe begin
{
        printf("Begin\n");
}
probe kernel.function("memcpy")
{
        buffer = @cast($src, "char");
        if (isinstr(buffer, "some pattern") != NULL) {
                printf("Found\n");
                print_backtrace();
        }
}

Этот сценарий выдает мне ошибку при запуске сценарияследующим образом: «stap -g stacktrace.stp»

неразрешенное выражение целевого символа: идентификатор «$ src»

семантическая ошибка: несоответствие типов (строка): идентификатор «буфер»at stacktrace.stp: 31: 14

 source:         if (isinstr(buffer, "shubham") != NULL) {
                                ^

семантическая ошибка: тип был впервые выведен здесь (long): идентификатор 'buffer' в: 30: 2

   source:         buffer = @cast($src, "char");
                    ^

Пропуск 2:анализ не удался.[man error :: pass2]

Я видел определение функции memcpy в коде ядра Linux, и параметр назван только как src.Я не могу разрешить имя переменной.Я пробовал разные имена $src, $from, $s, но ничего не получалось.

Версия ядра машины: 3.10.0-514.el7.x86_64 (RHEL 7.3 (Maipo))

На нем установлены следующие пакеты ядра:

  • kernel-debuginfo-common-x86_64-3.10.0-514.el7.x86_64
  • kernel-3.10.0-514.el7.x86_64
  • kernel-headers-3.10.0-514.el7.x86_64
  • kernel-debuginfo-3.10.0-514.el7.x86_64
  • kernel-devel-3.10.0-514.el7.x86_64

1 Ответ

0 голосов
/ 28 февраля 2019

Обновление 2:

buffer = @cast($src, "char");

Должно ли это быть указатель на символ вместо char ?


Обновление 1 : из документов systemtap

семантическая ошибка: неразрешенное выражение целевого символа

цельпеременная упоминалась в обработчике зонда, который не был разрешен.Или целевая переменная вообще недопустима в контексте, таком как функция скрипта.Эта переменная может быть исключена оптимизирующим компилятором или может не иметь подходящего типа, или где-то может быть просто досадная ошибка.Повторите попытку с немного другой зондирующей точкой (используйте оператор () вместо функции ()), чтобы найти более кооперативного соседа в той же области.


Оригинальные сообщения

Концепция переменной как дружественной вещи под названием src существует только в читаемом человеком исходном коде.Посмотри вокруг свой код.Вы еще не объявили переменные с именем src .

Я видел определение функции memcpy в коде ядра Linux, и этот параметр называется src

Да, но еще раз, это все на благо человека.


Часть, которую вам не хватает, заключается в том, что когда исходный код компилируется в приложение, компилятор объединяет все наши человеческие конструкции ипревращает их в смещения стека.

Предупреждение: я полностью игнорирую соглашения о вызовах функций для простоты.

Если вы посмотрите на скомпилированный двоичный файл, для вашей платформы, вы можете увидеть некоторые лучшие советы о том, что вам нужно сделать.Предполагая, что вы работаете в системе x86, вы увидите что-то вроде этого:

memcpy:
  push ebp
  mov ebp, esp
  sub esp, 8

  // The function body starts here and you will see references 
  // to what we recognize as the variable "src" with an instructions like

  mov edi, esp+0
  // That just loaded the EDI register with a reference to the location of src

Вы можете увидеть сборку для вашей платформы, используя gdb.

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