Почему существует разница в количестве инструкций, выполняемых программой, когда она работает под управлением GDB?

Я использую счетчик ARM PMU для подсчета количества инструкций, выполненных процессом между двумя системными вызовами. В частности, я использую событие INST_RETIRED для подсчета количества инструкций, выполненных процессом в пользовательском режиме. Ссылка: ARMv7 Справочное руководство R/A. Количество инструкций одинаково, если я запускаю программу в свободном режиме или под GDB. Проблема возникает, когда я пытаюсь создать поток, используя pthread_create. Количество инструкций, выполняемых одной и той же программой между двумя системными вызовами mprotect и clone (оба выполняются функцией pthread_create), отличается, когда я запускаю ее под GDB. Это означает, что пользовательская программа выполняет какой-то другой код, когда она работает под отладчиком, может быть в библиотеке, libpthread. Я видел исходный код pthread_create, но не смог найти ничего, связанного с флагами трассировки/отладки. Кто-нибудь, пожалуйста, объясните мне, откуда тогда эта двусмысленность?


person Jina Lee    schedule 05.03.2018    source источник


Ответы (1)


Я видел исходный код pthread_create, но не смог найти ничего, связанного с флагами трассировки/отладки.

На самом деле такой код есть здесь и здесь. report_events имеет значение true только при работе под отладчиком.

person Employed Russian    schedule 05.03.2018
comment
Поскольку я использовал более старую версию 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
comment
Позвольте мне задать еще один вопрос. Почему pthread_create определен в glibc? Разве он не должен быть частью исходного кода libpthread? - person Jina Lee; 06.03.2018
comment
@JinaLee GLIBC состоит из более чем 200 библиотек: libc.so.6, libpthread.so.0, ld-linux.so.2, libdl.so.2 и т. д. Реализация libpthread без глубокой интеграции с внутренними компонентами libc практически невозможна. - person Employed Russian; 06.03.2018