Pull to refresh

Comments 11

А не подскажете, какую версию bpftrace вы использовали? А то что-то он у меня (v0.11.4) в uptr не умеет.
uptr-not-found

Статью я писал с такой же версией 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)); }'?

Да, отработала с сообщением No probes to attach

No probes to attach обычно означает, что такой функции в бинарнике нет. Посмотреть на доступные пробы можно так: bpftrace -l 'ur:/usr/bin/bash:*'

Всё страньше и страньше. Вообще ничего не показывает. Причём на любой бинарник.

Если программа без 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? Посмотрите на список ядерных зависимостей, попробуйте собрать bpftrace локально, повесьте багу на bpftrace, если все выглядит ok, но uptr так и не цепляется

Из репозитория. Попробую собрать из git. Если заведётся, придётся, наверное заводить ишью ментейнерам дистрибутива.

Sign up to leave a comment.

Articles