Комментарии 11
Статью я писал с такой же версией bpftrace
. Какое у вас ядро? str(uptr(...))
конвертируется в вызов функции-помощника bpf_probe_read_kernel_str
, так что если ядро ее не поддерживает, то bpftrace
наверняка ступит.
Проверить, поддерживается ли эта функция, можно, запустив sudo bpftrace --info
(см. в секуии Kernel Helpers
). Если ваше ядро 5.5 или больше (или даже 5.4), то она должна поддерживаться. Если она поддерживается, то смело вешайте багу на bpftrace
.
$ uname -r
5.10.15-1-MANJARO
$ sudo bpftrace --info 2>&1|egrep 'probe_read_kernel_str'
probe_read_kernel_str: yes
Это нормально что функция помошник называется просто probe_read_kernel_str
?
Упс, сорри, я скопировал неправильную функцию! uptr
должен конвертироваться в probe_read_user_str
, конечно, а kptr
— в probe_read_kernel_str
. (Раньше была только probe_read_str
, которая угадывала принадлежность указателя.)
Загружается ли у вас программа bpftrace -e 'ur:/usr/bin/bash:readline { printf("%s\n", str(retval)); }'
?
Если программа без uptr
загружается (а она должна), то посмотрите на нее при помощи -dd
:
bpftrace -dd -e 'ur:/usr/bin/bash:readline { printf("%s\n", str(retval)); }'
Кроме всего прочего, она выведет что-то вроде
AST after semantic analysis
-------------------
Program
uretprobe:/usr/bin/bash:readline
call: printf :: type[none, ctx: 0]
string: %s\n :: type[string[3], ctx: 0]
call: str :: type[string[64], ctx: 0, AS(user)]
builtin: retval :: type[unsigned int64, ctx: 0, AS(user)]
здесь она увидела, что retval
— это пользовательский указатель. Дальше в промежуточных кодах LLVM будет какой-то probe
, у меня это
...
%probe_read_user_str = call i64 inttoptr (i64 114 to i64 ([64 x i8]*, i32, i64)*)([64 x i8]* %str, i32 %11, i64 %retval)
...
(в моем случае все правильно)
здесь она увидела, что retval — это пользовательский указатель.
У меня, получается, не увидела:
AST after semantic analysis
-------------------
Program
uretprobe:/usr/bin/bash:readline
call: printf :: type[none]
string: %s\n :: type[string[64]]
call: str :: type[string[64]]
builtin: retval :: type[unsigned int64]
в моем случае все правильно
А в моём юзерской не находит. Только такое:
%probe_read_str = call i64 inttoptr (i64 45 to i64 ([64 x i8]*, i32, i64)*)([64 x i8]* %str, i32 %11, i64 %retval)
Отлаживаем ядро из командной строки с bpftrace