Chcę debugować program wielowątkowy, kontrolując, które wątki będą wykonywane, kiedy. Używam C++ i gdb. Mam dwa wątki oprócz głównego wątku (dla przykładowego programu) i chcę debugować jeden wątek, przy jednoczesnym zatrzymaniu drugiego.Jak ograniczyć debugowanie gdb do jednego wątku w tym samym czasie?
Oto przykładowy program napisałem:
#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);
}
uruchomić gdb i ustawić punkt przerwania na linii z sleep(1)
. Następnie uruchamiam program. Otrzymuję trzy wątki (wątek 2 i 3 to pthreads), a program jest w wątku 2 (czekając na sleep(1)
). Teraz chcę zachować wątek 3 w dowolnym miejscu i dalej przechodzić przez wątek 2 (wykonując c
w gdb).
Co próbowałem to set scheduler-locking on
, ale nie wydaje się działać tak, jak się spodziewałem. Jestem w wątku 2, I set scheduler-locking on
, continue
parę razy (do tej pory tak dobrze, wciąż jestem w wątku 2), przełącz na wątek 3, set scheduler-locking on
, continue
iz jakiegoś powodu wracam do wątku 2 ... kiedy nie powinienem (zgodnie z moim rozumieniem). Czy jest coś, czego mi brakuje?
Dzięki za link ... okazuje się, że nawet gdy "następnym" po "ustawieniu blokowania harmonogramu" w wątku 3, nadal przekazuje kontrolę z powrotem do wątku 2. (Nie ma, jeśli I ' krok ", ale bardzo bolesne jest przechodzenie przez każdą instrukcję w kodzie biblioteki.) Czy jest jakieś polecenie poza' ustawionym blokowaniem harmonogramu ', które robi lewę? –
Nie wydaje się, że istnieje lepszy sposób, i wyjaśniłeś problem. Tak, akceptując tę odpowiedź. –
Użycie 'set scheduler-locking on' jest zależne od systemu operacyjnego. Wydaje się, że działa dobrze na moim systemie (jądro Linux 4.4.0, gdb 7.11.1, Ubuntu 16.04) –