Как я могу считать malloc в ядре Linux с помощью kprobe

Я хочу посчитать malloc Системный вызов с Kprobe в Fedora. я знаю это malloc это не системный вызов, он реализован в пространстве пользователя, но я хочу посчитать malloc с помощью kprobe, если это возможно.

Как называется системный вызов, который я должен дать Kprobe? Например для do_work:

kp.addr = (kprobe_opcode_t *) kallsyms_lookup_name("do_fork");

1 ответ

Решение

Это невозможно с помощью kprobes, потому что, как вы сказали, malloc это не системный вызов.

Однако вы можете использовать USDT для отслеживания процессов в пространстве пользователя. Инструменты Bcc содержат пример с uobjnew, Отслеживает распределение объектов в данном процессе:

$ ./uobjnew -h
usage: uobjnew.py [-h] [-l {java,ruby,c}] [-C TOP_COUNT] [-S TOP_SIZE] [-v]
                  pid [interval]

Summarize object allocations in high-level languages.

positional arguments:
  pid                   process id to attach to
  interval              print every specified number of seconds

optional arguments:
  -h, --help            show this help message and exit
  -l {java,ruby,c}, --language {java,ruby,c}
                        language to trace
  -C TOP_COUNT, --top-count TOP_COUNT
                        number of most frequently allocated types to print
  -S TOP_SIZE, --top-size TOP_SIZE
                        number of largest types by allocated bytes to print
  -v, --verbose         verbose mode: print the BPF program (for debugging
                        purposes)

examples:
    ./uobjnew -l java 145         # summarize Java allocations in process 145
    ./uobjnew -l c 2020 1         # grab malloc() sizes and print every second
    ./uobjnew -l ruby 6712 -C 10  # top 10 Ruby types by number of allocations
    ./uobjnew -l ruby 6712 -S 10 # top 10 Ruby types by total size
Другие вопросы по тегам