2011-07-17 12 views
13

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?

Odpowiedz

8

Wygląda na to, że blokowanie harmonogramu jest przydatne tylko w przypadku pojedynczego kroku lub następnego. Po kontynuowaniu bieżącego wątku wszystkie działają, a następny wątek, który trafi punkt przerwania, pobierze monity. Przynajmniej, że moja interpretacja instrukcji:

http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_39.html

Tak, gdy jesteś w wątku 3, pozostałe wątki są zatrzymane, i tak długo, jak krok/następny, nie będzie działać. Ale gdy będziesz kontynuował, wszystkie będą działać, a następny wątek (2 w twoim przykładzie), który dotrze do punktu przerwania snu (1), spowoduje wyświetlenie monitu.

Może pozwolić, aby wszystkie wątki trafiły w sen, ale wtedy kontynuuj tylko jedną z nich naraz.

+0

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ę? –

+0

Nie wydaje się, że istnieje lepszy sposób, i wyjaśniłeś problem. Tak, akceptując tę ​​odpowiedź. –

+0

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) –

2

Jak powiedział TazMainiac, blokowanie harmonogramu jest przydatne do pojedynczego kroku, ale "tryb" musi być ustawiony na "krok".

set scheduler-locking step 

Można odwołać link podany przez TazMainiac który wspomina sam:

http://ftp.gnu.org/old-gnu/Manuals/gdb-5.1.1/html_node/gdb_39.html

Tryb krok optymalizuje dla pojedynczego stepping. Zatrzymuje on inne wątki przed "przejęciem podpowiedzi" przez uprzedzenie bieżącego wątku podczas kroku .

Powiązane problemy