Выяснение, почему процесс проводит время в ядре в win32 - PullRequest
0 голосов
/ 27 ноября 2008

Я компилирую проект vc8 C ++ в сеансе WinXp VmWare. Это чертовски медленно, чем gcc3.2 в сеансе RedHat VmWare, поэтому я смотрю на диспетчер задач. Это говорит, что очень большой процент моего процесса компиляции тратится в ядре. Мне это не кажется правильным.

Есть ли эквивалент для strace для Win32? По крайней мере, кое-что, что даст мне обзор того, какие функции ядра вызываются. Может быть что-то, что является виновником.

Ответы [ 3 ]

3 голосов
/ 27 ноября 2008

Windows Resource Kit содержит инструмент под названием kernrate. Это профилировщик выборки. Он может профилировать всю систему или определенный процесс. По умолчанию его разрешение находится на уровне модуля, но может быть уменьшено до нескольких байтов. У вас должно получиться разрешение по умолчанию, так как вы увидите, какие модули / драйверы потребляют большую часть времени.

Здесь - некоторая информация относительно его использования.

2 голосов
/ 27 ноября 2008

Не совсем корректно, но есть способ получить видимость в стеке вызовов ядра, и путем выборки его во времена высокой загрузки ЦП вы обычно можете оценить, что израсходовано все время.

Установите Process Explorer и убедитесь, что вы настроили его с поддержкой сервера символов. Вы можете сделать это:

  1. Установка WinDebug для получения обновленного dbghelp.dll
  2. Настройте Process Explorer для использования этой версии dbghelp.dll, указав путь в Параметры | Меню «Настройка символов» в Process Explorer.
  3. Также в том же диалоговом окне установите путь к символам так, чтобы он включал сервер символов MS и локальный кэш.

Вот пример значения для пути символа:

SRV*C:\symbolcache*http://msdl.microsoft.com/download/symbols

(Вы можете установить для переменной среды _NT_SYMBOL_PATH одинаковое значение, чтобы инструменты отладки использовали один и тот же сервер символов и путь кэш-памяти.) Этот путь приведет к тому, что dbghelp.dll будет загружать символы на локальный диск при запросе символов для модуля, который не имеет символов локально.

После настройки Process Explorer, подобной этой, вы можете получить свойства процесса, перейти на вкладку нитей и дважды щелкнуть по самому загруженному потоку. Это заставит Process Explorer временно подключиться к процессу и просканировать стек потока, а затем перейти к поиску символов для различных адресов возврата в стеке. Символы адресов возврата и имена модулей (для сторонних драйверов не от MS) должны дать вам четкое представление о том, на что тратится ваше процессорное время.

0 голосов
/ 27 ноября 2008

Поддержка VmWare должна быть направлена ​​на этот вопрос. Это, вероятно, где-то в реализации VmWare.

Вы можете использовать, например, IrpTracker , который дает вам представление о том, что происходит в ядре. Другой вариант - использование отладчика ядра, т.е. WinDbg . Если загрузка процессора очень высока, то просто случайный сбой в отладчике и просмотр стека вызовов может дать вам представление, кто является драйвером загрузки процессора. Но, как я уже сказал, я думаю, что это будет какой-то компонент VmWare. Стоит проверить, сохраняется ли проблема на том же компьютере на WinXP без эмуляции.

...