Во-первых, вам нужно включить удобное для многопоточности поведение отладчика с помощью следующих команд. Понятия не имею, почему он отключен по умолчанию.
set target-async 1
set non-stop on
Я лично поместил эти команды в файл .gdbinit . Они заставляют каждую вашу команду применяться только к текущему сосредоточенному потоку. Примечание: поток может быть запущен, поэтому вы должны приостановить его.
Чтобы увидеть сфокусированный поток, выполните thread
.
Чтобы переключиться на другой поток, добавьте номер потока, например, thread 2
.
Для просмотра всех тем с их номерами выдайте info thread
.
Чтобы применить команду к определенному потоку, выполните что-то вроде thread, примените команду threadnum . Например. thread apply 4 bt
применит команду backtrace для потока с номером 4. thread apply all continue
продолжает все приостановленные потоки.
Однако существует небольшая проблема - многим командам требуется приостановка потока. Я знаю несколько способов сделать это:
interrupt
команда: прерывает выполнение потока, принимает номер потока для приостановки, без аргумента прерывает сфокусированный.
- Установка точки останова где-нибудь. Обратите внимание, что вы можете установить точку останова для определенного потока, чтобы другие потоки игнорировали ее, например, break linenum thread threadum . Например.
break 25 thread 4
.
Вы также можете найти очень полезным, что вы можете установить список команд, которые будут выполняться при достижении точки останова с помощью команды commands
- например, Вы можете быстро напечатать интересные значения, а затем продолжить выполнение.