Я хочу извлечь следы выполнения (например, посещенные базовые 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), чтобы избежать конфликтов имен.