как GDB присоединяется к многопоточному процессу

Когда мы используем gdb attach чтобы отладить работающий процесс, мы могли бы использовать gdb attach pid Если процесс имеет два или более потоков, pid — это основной поток.

Теперь я хочу реализовать простой отладчик для отладки многопоточного процесса, но когда я использую свой отладчик для подключения многопоточного процесса, только main thread приостановлено.

Я хочу знать, почему использовать только основной поток TID, gdb можно прикрепить все потоки этого процесса, как GDB приостановить все потоки? мы предполагаем, что когда мы используем gdb attach, все темы были созданы.

1

Решение

Я хочу знать, почему использовать только основной поток 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) для каждого потока.

2

Другие решения

ptrace PTRACE_ATTACH посылает SIGSTOP к процессу, который приостанавливает весь процесс, то есть все потоки.

2

TID основного потока, имеющий то же числовое значение, что и PID процесса, является исторической аварией систем Linux; это не так в других системах Unix.

Когда GDB (или любой отладчик) подключается к процессу с помощью ptrace, все потоки этого процесса приостанавливаются.

0
По вопросам рекламы [email protected]