Я использую счетчик ARM PMU для подсчета количества инструкций, выполненных процессом между двумя системными вызовами. В частности, я использую событие INST_RETIRED для подсчета количества инструкций, выполненных процессом в пользовательском режиме. Ссылка: ARMv7 Справочное руководство R/A. Количество инструкций одинаково, если я запускаю программу в свободном режиме или под GDB. Проблема возникает, когда я пытаюсь создать поток, используя pthread_create. Количество инструкций, выполняемых одной и той же программой между двумя системными вызовами mprotect и clone (оба выполняются функцией pthread_create), отличается, когда я запускаю ее под GDB. Это означает, что пользовательская программа выполняет какой-то другой код, когда она работает под отладчиком, может быть в библиотеке, libpthread. Я видел исходный код pthread_create, но не смог найти ничего, связанного с флагами трассировки/отладки. Кто-нибудь, пожалуйста, объясните мне, откуда тогда эта двусмысленность?
Почему существует разница в количестве инструкций, выполняемых программой, когда она работает под управлением GDB?
Ответы (1)
Я видел исходный код pthread_create, но не смог найти ничего, связанного с флагами трассировки/отладки.
На самом деле такой код есть здесь и здесь. report_events
имеет значение true только при работе под отладчиком.
person
Employed Russian
schedule
05.03.2018
Поскольку я использовал более старую версию Glibc (2.17). Я не смог найти эту проверку в pthread_create.c. Оказывается, такая проверка на создание потока была в файле createthread.c в функции
create_thread (struct pthread *pd, const struct pthread_attr *attr,...)
именно для моей версии glibc. Спасибо, что наставили на правильный путь!
- person Jina Lee; 05.03.2018
Позвольте мне задать еще один вопрос. Почему pthread_create определен в glibc? Разве он не должен быть частью исходного кода libpthread?
- person Jina Lee; 06.03.2018
@JinaLee GLIBC состоит из более чем 200 библиотек:
libc.so.6
, libpthread.so.0
, ld-linux.so.2
, libdl.so.2
и т. д. Реализация libpthread
без глубокой интеграции с внутренними компонентами libc
практически невозможна.
- person Employed Russian; 06.03.2018