Когда мы используем gdb attach
чтобы отладить работающий процесс, мы могли бы использовать gdb attach pid
Если процесс имеет два или более потоков, pid — это основной поток.
Теперь я хочу реализовать простой отладчик для отладки многопоточного процесса, но когда я использую свой отладчик для подключения многопоточного процесса, только main thread
приостановлено.
Я хочу знать, почему использовать только основной поток TID, gdb
можно прикрепить все потоки этого процесса, как GDB приостановить все потоки? мы предполагаем, что когда мы используем gdb attach
, все темы были созданы.
Я хочу знать, почему использовать только основной поток TID, GDB может присоединить все потоки этого процесса, как GDB приостановить все потоки?
Когда вы делаете attach PROCESS_PID
gdb
внутренне вызывает ptrace (PTRACE_ATTACH) для каждого потока. в Linux вы можете проверить это самостоятельно:
$ strace -e ptrace -p GDB_PROCESS_PID
Просто запустите программу с несколькими потоками, запустите gdb и перед запуском attach PROCESS_PID запустите strace в другой консоли. Вы должны увидеть ptrace (PTRACE_ATTACH) для каждого потока.
ptrace PTRACE_ATTACH
посылает SIGSTOP
к процессу, который приостанавливает весь процесс, то есть все потоки.
TID основного потока, имеющий то же числовое значение, что и PID процесса, является исторической аварией систем Linux; это не так в других системах Unix.
Когда GDB (или любой отладчик) подключается к процессу с помощью ptrace, все потоки этого процесса приостанавливаются.