Я хочу отладить многопоточную программу, контролируя, когда какие потоки будут выполняться.Я использую C ++ и GDB.У меня есть два потока помимо основного потока (для примера программы), и я хочу отладить один поток, в то время как другой остановлен.
Вот пример программы, которую я написал:
#include <iostream>
#include <pthread.h>
#include <stdlib.h>
#define NUM_THREADS 2
using namespace std;
void * run (void *) {
for (int i = 0; i < 3; ++i) {
sleep(1);
cout << i << " " << pthread_self() << endl;
}
pthread_exit(NULL);
}
int main (int argc, char** argv) {
cout << "Start..." << endl;
int rc;
pthread_t threads[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; ++i) {
rc = pthread_create(&threads[i], NULL, run, NULL);
if (rc) {
cout << "pthread_create returned error: " << rc << endl;
exit(-1);
}
}
pthread_exit(NULL);
}
Я запускаю GDB и устанавливаю точку останова в строке с sleep(1)
.Затем я запускаю программу.Я получаю три потока (потоки 2 и 3 являются pthreads), и программа находится в потоке 2 (ожидание в sleep(1)
).Теперь я хочу сохранить поток 3, где бы он ни находился, и продолжать проходить через поток 2 (выполнив c
в gdb).
Я попробовал set scheduler-locking on
, но, похоже, он не работает так, как я ожидал.Я нахожусь в потоке 2, я set scheduler-locking on
, continue
пару раз (пока все хорошо, я все еще в потоке 2), переключаюсь на поток 3, set scheduler-locking on
, continue
, и по какой-то причине яя вернулся в теме 2 ... когда я не должен быть (в соответствии с моим пониманием).Есть ли что-то, что мне не хватает?