Профилирование LLVM для дочернего процесса - PullRequest
1 голос
/ 03 августа 2020

Я хочу извлечь следы выполнения (например, посещенные базовые c блоки) при тестировании Apache сервера (httpd) . Поскольку моя работа основана на инфраструктуре LLVM, я предпочитаю использовать профилирование на основе инструментария clang следующим образом:

clang -fprofile-instr-generate ${options to compile httpd} -o httpd
export LLVM_PROFILE_FILE=code-%p.profraw
sudo -E ./httpd -k start # output a .profraw
curl ${url} # send a request
sudo -E ./httpd -k stop # output another .profraw

Компиляция инструментального httpd работает хорошо. Однако я хочу отслеживать обработку запроса httpd, которая выполняется в отдельном дочернем процессе. Выходной .profraw не записывает выполнение дочерних процессов. В результате я могу получить доступ только к следам выполнения запуска и закрытия сервера. Как я могу получить .profraw, включая обработку запросов?

Не ограничено профилированием clang. Любое решение, совместимое с LLVM, прекрасно. Спасибо!

Обновление Из журналов выясняется, что дочерний процесс, владельцем которого является «демон», не имеет разрешения на запись в файлы

LLVM Profile Error: Failed to write file "code-94752.profraw": Permission denied

Проблема решена Проблема в коллизии имен файлов prof. Процесс httpd -k start создает несколько дочерних процессов как рабочих. При использовании LLVM_PROFILE_FILE=code-%p.profraw их pid %p такой же. Таким образом, главный процесс принадлежит root и первым создает файл prof. Тогда последний процесс, принадлежащий демону, не сможет записать этот файл.

Решение: используйте LLVM_PROFILE_FILE=code-%9m.profraw (% Nm вместо% p), чтобы избежать конфликтов имен.

...