- Вопрос или проблема
- Ответ или решение
- Почему PID (идентификатор процесса) изменяется в разных сессиях терминала в WSL2?
- 1. Определение процесса и PID
- 2. Запуск, завершение и переименование процессов
- 3. Состояние процессов
- 4. Использование ps для отображения процессов
- 5. Правильный подход к отладке с gdb
- Заключение
Вопрос или проблема
Я использую WSL2 и пытался использовать gdb для отладки кода на C, следуя этой шпаргалке по gdb. Вкратце, она показывает способ вызова кода на Python solve.py, который вызывает код на C и отображает свой PID. А в другом терминальном сеансе я запускаю gdb, чтобы взаимодействовать с процессом solve.py, указывая PID solve.py.
Однако я понял, что не могу взаимодействовать с solve.py, потому что PID процесса был неверным. Я запустил ps и обнаружил, что solve.py немного отличается от того, что я увидел в первом терминале. Может кто-то объяснить, почему? Ниже приводится демонстрация.
(env) junha@DESKTOP-3B9ANKQ:~/cs2107$ python3 solve.py
[+] Запуск локального процесса './test': pid 627
[*] Приостановлено (нажмите любую клавишу для продолжения)
Затем я должен запустить
gdb -p 627
как указано в шпаргалке.
Но это не работает, и когда я использую ps a
, я вижу, что фактический PID 624, а не 627.
junha@DESKTOP-3B9ANKQ:~$ ps a
PID TTY STAT TIME COMMAND
226 hvc0 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear --keep-baud - 115200,38400,9600 vt220
231 tty1 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear - linux
388 pts/0 Ss 0:00 -bash
389 pts/1 Ss 0:00 /bin/login -f
508 pts/1 S+ 0:00 -bash
573 pts/2 Ss 0:00 -bash
624 pts/0 S+ 0:00 python3 solve.py
627 pts/3 Ss+ 0:00 ./test
629 pts/2 R+ 0:00 ps a
И ниже работает.
gdb -p 624
Это не проблема WSL. Боюсь, вы неправильно поняли намерения руководства.
Скрипт solve.py
запускает целевой процесс для вас с помощью программы python3
(здесь он называется ./test
). Вы хотите прикрепить gdb
к этому процессу, а не к python3
.
Вы также можете пропустить pwndbg
на данный момент и сначала попробовать с простым gdb ./test
. Это упростит настройку, но навигация в gdb будет более громоздкой. pwndbg
добавляет немного «вкуса», но настройка может сбивать с толку новичка.
Ответ или решение
Почему PID (идентификатор процесса) изменяется в разных сессиях терминала в WSL2?
В процессе работы с gdb
и отладкой через Python в среде Windows Subsystem for Linux 2 (WSL2) может возникнуть ситуация, когда идентификатор процесса (PID) другого запущенного процесса отличается между сессиями терминала. Давайте рассмотрим, почему так происходит.
1. Определение процесса и PID
Каждое приложение или скрипт, запущенный в операционной системе, получает уникальный идентификатор процесса — PID. Это позволяет операционной системе идентифицировать и управлять процессами. При запуске программы каждый вызов создает новый экземпляр процесса с уникальным PID.
2. Запуск, завершение и переименование процессов
Временные характеристики процессов могут варьироваться в зависимости от момента и способа их запуска. Например, при старте solve.py
, он, в свою очередь, запускает другой процесс, называемый ./test
, который также получает уникальный идентификатор. Когда вы видите в консоли PID 627
, это может вводить в заблуждение, если вы не обращаете внимания на то, какой процесс вы пытаетесь отладить.
3. Состояние процессов
Состояние процесса может меняться, и в разные моменты времени сулит новые нестабильные характеристики:
- Если вы случайно запустили несколько экземпляров
solve.py
, каждый из них будет иметь свой PID. - Убедитесь, что вы активируете
gdb
для конкретного процесса. Когдаsolve.py
запускает./test
, и вы пытаетесь подключиться к PID627
, это может быть PID дочернего процесса./test
, который может изменяться при каждом запуске.
4. Использование ps
для отображения процессов
Команда ps
показывает текущие запущенные процессы в вашей сессии. Если вы запускаете эту команду до того, как завершится процесс solve.py
, вы можете видеть разные PID из-за разницы в времени выполнения. Каждая новая сессия терминала может отображать немного измененные данные о процессах, поскольку процесс может завершиться или измениться до того, как вы успеете подключиться к нему.
5. Правильный подход к отладке с gdb
При использовании gdb
необходимо следовать лучшим практикам:
- Убедитесь, что вы подключаетесь к правильному PID, связанному с вашим целевым процессом (в данном случае
./test
). - Запустите
gdb
с правильными параметрами, чтобы минимизировать путаницу между процессами.
Ваша команда:
gdb -p [PID]
должна быть направлена на корректный PID, который, как вы заметили, в вашем случае стал 624
, а не 627
.
Заключение
Изменение PID между сессиями терминала в WSL2 связано с динамическим управлением процессами операционной системой и их идентификацией. Понимание процессов и их взаимоотношения — ключ к успешной отладке программного обеспечения. Обратите внимание на то, какой процесс вы отслеживаете и соединяетесь ли с нужным экземпляром. Если вам нужны дополнительные советы по отладке с gdb
, не стесняйтесь обращаться за помощью.