команда приостановить поток с GDB - PullRequest
12 голосов
/ 18 апреля 2011

Я немного новичок в GDB. Я надеюсь, что кто-то может помочь мне с чем-то, что должно быть довольно простым, я использовал Google / docs, но я просто что-то упустил.

Каков «нормальный» способ отладки многопоточных приложений с помощью GDB? Я использую pthreads. Я хочу посмотреть только одну ветку - я вижу два варианта:

a) указать отладчику как-то присоединиться к определенному потоку, чтобы переход не приводил к переходу потоков при каждом переключении контекста

b) сказать отладчику приостановить / освободить любые «неинтересные» потоки

Я бы предпочел пойти по маршруту б) - читая справку для GDB Я не вижу команды для этого, советы?

Ответы [ 2 ]

10 голосов
/ 18 апреля 2011

См. Документацию для set scheduler-locking on.

Остерегайтесь: если вы приостановите другие потоки, и если один из них удерживает блокировку, и если ваш интересный поток нуждается в этой блокировке в какой-то моментшагая, вы будете в тупике.

Каков "нормальный" способ отладки потоковых приложений

Вы никогда не сможете отладить правильность потока, вы можете создать его только вПо моему опыту, большая часть отладки многопоточных приложений заключается в утверждениях и изучении состояния мира, когда одно из утверждений нарушается.

9 голосов
/ 18 июня 2014

Во-первых, вам нужно включить удобное для многопоточности поведение отладчика с помощью следующих команд. Понятия не имею, почему он отключен по умолчанию.

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 - например, Вы можете быстро напечатать интересные значения, а затем продолжить выполнение.

...