Поделиться через


Управление процессами и потоками

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

Текущий или активный процесс — это процесс, который в настоящее время отлаживается. Аналогичным образом текущий или активный поток — это поток, контролируемый отладчиком. Действия многих команд отладчика определяются идентификатором текущего процесса и потока. Текущий процесс также определяет сопоставления виртуальных адресов, которые использует отладчик.

При начале отладки текущий процесс — это тот, к которому подключен отладчик, или тот, который вызвал исключение, приведшее к запуску отладчика. Аналогичным образом, текущий поток — это тот, который был активным при подключении отладчика к процессу или стал причиной исключения. Однако отладчик можно использовать для изменения текущего процесса и потока, а также для замораживания или отмены отдельных потоков.

В отладке в режиме ядра процессы и потоки не контролируются методами, описанными в этом разделе. Дополнительные сведения о том, как процессы и потоки обрабатываются в режиме ядра, см. в разделе "Изменение контекстов".

Отображение процессов и потоков

Чтобы отобразить сведения о процессе и потоке, можно использовать следующие методы:

Настройка текущего процесса и потока

Чтобы изменить текущий процесс или поток, можно использовать следующие методы:

Замораживание и приостановка потоков

Отладчик может изменить выполнение потока, приостановив поток или заморозив поток. Эти два действия имеют несколько разные эффекты.

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

Как правило, у каждого потока счётчик приостановок равен нулю. Когда отладчик подключается к процессу, он увеличивает счетчик приостановок всех потоков в этом процессе на единицу. Если отладчик отсоединяется от процесса, он уменьшает все счетчики приостановки на единицу. Когда отладчик выполняет процесс, он временно уменьшает все счетчики приостановки на единицу.

Вы можете контролировать счетчик приостановок любого потока в отладчике с помощью следующих методов:

  • Команда ~n (Приостановка потока) увеличивает число приостановки указанного потока по одному.

  • Команда ~m (Resume Thread) уменьшает счетчик приостановок указанного потока на единицу.

Наиболее распространённое использование этих команд — повысить счётчик приостановок конкретного потока с одного до двух. Когда отладчик запускается или отсоединяется от процесса, поток имеет счетчик приостановки со значением один и остается приостановленным, даже если другие потоки продолжают выполняться.

Вы можете приостановить потоки даже при выполнении неисключительной отладки.

Отладчик также может заморозить поток. Это действие похоже на приостановку потока несколькими способами. Однако "замороженный" — это только параметр отладчика. В операционной системе Windows ничего не указывает на то, что этот поток чем-то отличается.

По умолчанию все потоки разблокированы. Когда отладчик инициирует выполнение процесса, замороженные потоки не выполняются. Однако если отладчик отсоединяется от процесса, все потоки размораживаются.

Чтобы замораживать и размораживать отдельные потоки, можно использовать следующие методы:

В любом случае потоки, принадлежащие целевому процессу, никогда не выполняются, когда отладчик прерывает его выполнение. Количество приостановки потока влияет на поведение потока только в том случае, если отладчик выполняет процесс или отсоединяет его. Замороженное состояние влияет на поток только при выполнении отладчиком процесса.

Потоки и процессы в других командах

Вы можете добавлять описатели потоков или описатели процессов перед множеством других команд. Дополнительные сведения см. в отдельных разделах команд.

Можно добавить модификатор ~e (Thread-Specific Command) перед многими командами и командами расширения. Этот квалификатор приводит к выполнению команды в контексте указанного потока. Этот параметр особенно полезен, если вы хотите применить команду к нескольким потокам. Например, следующая команда повторяет команду расширения !gle для каждого отлаживаемого потока.

~*e !gle 

Несколько систем

Отладчик может подключаться к нескольким целевым объектам одновременно. Если эти процессы включают файлы дампа или включают динамические целевые объекты на нескольких компьютерах, отладчик ссылается на систему, процесс и поток для каждого действия. Дополнительные сведения об этой отладке см. в разделе "Отладка нескольких целевых объектов".