Что такое RtlPcToFileHeader? - PullRequest
       8

Что такое RtlPcToFileHeader?

1 голос
/ 18 октября 2010

Я профилирую приложение, используя VerySleepy 0.7.Приложение написано на C ++ с использованием Qt 4.6.x, скомпилировано с VS 2005 и работает под управлением Windows 7 Ultimate x64.

Наибольшее распространение пока вызывает RtlPcToFileHeader

Exclusive Inclusive %Exclusive %Inclusive Module
33.67s    33.67s    15.13%     15.13%     ntdll

Из документации мне не ясно, что такое RtlPcToFileHeader, но поскольку на него ссылаются в разделе «Функции обработки ошибок», кажется, что это то, чего не должно быть.При этом, поскольку он использовался в основном на протяжении всего моего захвата профилирования, это также может быть какой-то очень простой вызов функции (например, main) или побочный эффект самого профилирования.

Какова цельфункции RtlPcToFileHeader?

Обновление: по предложению Майка я ворвался в рабочий процесс, и пару раз он включал RtlPcToFileHeader в трассировку стека, который, казалось, был как-то привязан к dynamic_cast.Я также перешел на вопрос, чтобы лучше отразить, что я пытаюсь определить, что на самом деле делает RtlPcToFileHeader.

Ответы [ 3 ]

2 голосов
/ 14 февраля 2011

В следующем сообщении MSDN подразумевается, что x64-реализация Microsoft процедур RTTI, вызываемых во время dynamic_cast, медленнее, чем x86.

http://blogs.msdn.com/b/junfeng/archive/2006/10/17/dynamic-cast-is-slow-in-x64.aspx

Эти указатели RTTI в 64-битных системах кажутся только смещениями от базового адреса модуля.Чтобы разыменовать их, вам нужен базовый адрес модуля - который получается функцией API :: RtlPcToFileHeader ().

Если это правильно, кажется, что вы ничего не можете с этим поделать, кроме рефакторинга вашего кода, чтобы минимизировать использование dynamic_casts и больше полагаться на виртуальные методы.Или это может быть только несовершенством профилировщика - он теряется в dynamic_casts?

2 голосов
/ 18 октября 2010

Просто приостановите его под отладчиком. Изучите стек вызовов, чтобы понять, что он делает и почему. Затем повторите несколько раз. Это скажет вам, куда идет время и причины почему.

Если это слишком низко для вас, попробуйте LTProf или любой другой сэмплер стенного времени, который сообщает процент на уровне строки, предпочтительно с помощью средства просмотра бабочки.

Числа, над которыми вы озадачиваетесь, - это точно наследие gprof .

1 голос
/ 03 января 2018

RtlPcToFileHeader - это функция, которая использует произвольный адрес (PcValue) для поиска базового адреса соответствующего модуля, сопоставленного с адресным пространством текущего процесса.Это очень похоже на вызов:

HMODULE hModule = NULL;
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
   GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
   pArbitraryAddr,
   &hModule);

Для своего поиска он просматривает адреса всех модулей, сопоставленных с текущим процессом, для которых он использует структуры процесса PEB/TEB в памяти.Перед этим он получает общую блокировку RW (аналогично вызову AcquireSRWLockShared) и затем освобождает ее, когда поиск завершен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...