#c #linux #valgrind #arm64 #perf
Вопрос:
Когда я использую инструмент valgrind bbv, я столкнулся с проблемой. Количество команд одного и того же исполняемого файла valgrind сильно отличается от количества команд pmu. Например, в SPEC2006 omnetpp количество команд составляет около 57190 миллиардов в valgrind, но в pmu оно составляет 57290 миллиардов. Среда, в которой выполняется программа, одинакова.
- Затем мы написали простую программу, чтобы проверить это, в результате количество инструкций valgrind примерно на 800 меньше. Тестовый код:
#include <unistd.h> int main(void) { unsigned int i = 0, sum = 0; sum = i; return 0; }
valgrind --tool=exp-bbv ./withmain
Всего инструкций: 5232simpleperf stat -e instructions:u ./withmain
(просто посчитайте инструкции в пространстве использования)
Статистика счетчика производительности:
6 043 инструкции:u # (100%)
2. Затем мы обнаружили, что такие функции, как _start и _init, НЕИЗВЕСТНЫ в valgrind, а размер символов этих функций равен нулю. Вальгринд, похоже, игнорирует их во время анализа команд.
Я обнаружил, что в m_main.c есть такие описания такого рода функций glibc:
Если связывание конечных исполняемых файлов выполняется с присутствием glibc, то Valgrind начинается с main() выше, как обычно, и весь следующий код не имеет значения. Однако это не предполагаемый способ использования. План состоит в том, чтобы избежать привязки к glibc, предоставив gcc файлы flags-nodefaultlibs-lgcc-nostart при запуске.
Q:
1) Кто-нибудь знает, почему valgrind не может проанализировать эти функции?
2) Приведенные выше описания означают, что мы должны избегать использования функции glibc? Есть ли какой-либо другой способ устранить эту разницу в количестве инструкций?
3) Почему размер некоторого символа функции(например, _start, _init и т.д.) Равен нулю в файле elf? но когда я загружаю этот файл, я вижу весь код этих функций.
3. Программная среда:
- Операционная среда: Andriod10 (aarch64 Linux 4.14)
- Ядро процессора: armv8 CotexA55
- Кросс-компилятор: gcc-linaro-7.5.0-2019.12-x86_64_arch64-linux-gnu (как valgrind, так и тестовый код компилируются этим перекрестным инструментом, —static, -g -O3 и другими уже опробованными парами). Я пробовал gcc-4.8.2, у которых та же проблема.