У меня есть программа, которая использует два потока. Я поместил точку останова в обоих потоки. При запущении программы под gdb я хочу переключиться между потоками и заставить их работать. (поток t1 является активным и рабочим и поток t2; при приостановке на точке останова. Я хочу остановить выполнение T1 и выполнить T2).
Есть ли какой-либо способ, которым я могу запланировать потоки в gdb?
используйте условия прерывания
(gdb) break frik.c:13 thread 28 if bartab > lim
Правка:
(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.
По умолчанию 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').
Итак, вам нужно установить точки останова, затем установить блокировку планировщика на
, затем продолжить
или ] finish
в потоке 1 (поток 2 все еще остановлен), затем Ctrl-C, чтобы восстановить контроль над GDB, переключиться на поток 2, продолжить
(поток 1 все еще остановлен) и т. д.
Осторожно: установив блокировку планировщика на
, очень легко заставить подчиненный процесс самоблокироваться.