Gdb: многопоточность

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

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

Спасибо Arpit

Ответы

Ответ 1

По умолчанию 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, очень легко привести к тому, что нижестоящий процесс будет автоматически зависеть.

Ответ 2

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

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

Ранее упоминавшаяся команда "scheduler-locking on" позволяет вам выполнить один поток с остальными. Режим без остановки позволяет вам выполнить один поток с активными другими.

Ответ 3

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

(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.