Почему pid меняется в разных терминальных сеансах?

Вопрос или проблема

Я использую 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, и вы пытаетесь подключиться к PID 627, это может быть PID дочернего процесса ./test, который может изменяться при каждом запуске.

4. Использование ps для отображения процессов

Команда ps показывает текущие запущенные процессы в вашей сессии. Если вы запускаете эту команду до того, как завершится процесс solve.py, вы можете видеть разные PID из-за разницы в времени выполнения. Каждая новая сессия терминала может отображать немного измененные данные о процессах, поскольку процесс может завершиться или измениться до того, как вы успеете подключиться к нему.

5. Правильный подход к отладке с gdb

При использовании gdb необходимо следовать лучшим практикам:

  • Убедитесь, что вы подключаетесь к правильному PID, связанному с вашим целевым процессом (в данном случае ./test).
  • Запустите gdb с правильными параметрами, чтобы минимизировать путаницу между процессами.

Ваша команда:

gdb -p [PID]

должна быть направлена на корректный PID, который, как вы заметили, в вашем случае стал 624, а не 627.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...