У меня есть системный скрипт, который проверяет функцию ядра «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'
семантическая ошибка: несоответствие типа (строка): идентификатор 'buffer' в stacktrace.stp:31:14
source: if (isinstr(buffer, "shubham") != NULL) { ^
семантическая ошибка: тип был впервые выведен здесь (длинный): идентификатор «буфер» в: 30: 2
source: buffer = @cast($src, "char"); ^
Проход 2: анализ не пройден. [человеческая ошибка :: pass2]
Я видел определение функции memcpy в коде ядра Linux, и этот параметр называется только src. Я не могу разрешить имя переменной. Я пробовал разные имена $src
, $from
, $s
, но ничего не получалось.
Версия ядра машины: 3.10.0-514.el7.x86_64 (RHEL 7.3 (Maipo))
На нем установлены следующие пакеты ядра:
- ядро-debuginfo-common-x86_64-3.10.0-514.el7.x86_64
- ядро-3.10.0-514.el7.x86_64
- заголовки ядра-3.10.0-514.el7.x86_64
- информация об отладке ядра-3.10.0-514.el7.x86_64
- ядро-разработка-3.10.0-514.el7.x86_64
buffer = kernel_string($src);
, но если бы вы могли объяснить, почему вы хотите преобразовать void* в char - может быть, вам нужен только один байт? - Мы можем с этим помочь. - person Mark Plotnick   schedule 21.02.2019$src
. Можете ли вы отредактировать свой вопрос, указав, какой дистрибутив вы используете и какие пакеты kernel-devel, kernel-debug и kernel-debuginfo у вас установлены? - person Mark Plotnick   schedule 21.02.2019