Как продолжить один поток за раз при отладке многопоточной программы в GDB? - PullRequest
28 голосов
/ 15 апреля 2010

У меня есть программа, которая использует два потока.Я поставил точку останова в обоих потоках.Во время работы программы под GDB я хочу переключаться между потоками и заставить их работать.(поток t1 активен и работает, а поток t2; когда он остановлен на точке останова. Я хочу остановить запуск T1 и запустить T2).

Есть ли способ, которым я могу запланировать потоки в GDB?

Ответы [ 3 ]

38 голосов
/ 17 апреля 2010

По умолчанию GDB останавливает все потоки при достижении любой точки останова и возобновляет все потоки при вводе любой команды (например, continue, next, step, finish, и т. д.), который требует, чтобы выполнялся подчиненный процесс (тот, который вы отлаживаете).

Однако вы можете сказать GDB не делать этого:

(gdb) help set scheduler-locking 
Set mode for locking scheduler during execution.
off  == no locking (threads may preempt at any time)
on   == full locking (no thread except the current thread may run)
step == scheduler locked during every single-step operation.
    In this mode, no other thread may run during a step command.
    Other threads may run while stepping over a function call ('next').

Таким образом, вы захотите установить точки останова, затем set scheduler-locking on, затем continue или finish в потоке 1 (поток 2 все еще остановлен), затем Ctrl-C, чтобы восстановить контроль над GDB, переключиться на поток 2 , continue (поток 1 все еще остановлен) и т. Д.

Остерегайтесь: установив scheduler-locking on, очень просто заставить подчиненный процесс самоблокироваться.

5 голосов
/ 08 июля 2011

Если вы используете GDB 7 или более позднюю версию, попробуйте «безостановочный режим».

http://sourceware.org/gdb/current/onlinedocs/gdb/Non_002dStop-Mode.html

Команда "scheduler-lock on", упомянутая выше, позволяет вам выполнить один поток, когда остальные остановлены. Безостановочный режим позволяет вам перейти на один поток с активными другими.

1 голос
/ 15 апреля 2010

использовать условия перерыва

(gdb) break frik.c:13 thread 28 if bartab > lim

см. Отладка с помощью GDB

Edit:

(gdb) break <thread_function_entry_point> thread 2
(gdb) break <thread_function_entry_point> thread 1
(gdb) thread 1
(gdb) continue
(gdb) ... thread 1 finishes
(gdb) thread 2
(gdb) continue

Вы можете поместить эти команды в файл .gdbrc.

...