Как ограничить отладку GDB одним потоком за раз

Я хочу отлаживать многопоточную программу, контролируя, какие потоки и когда выполняются. Я использую 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 - это потоки p), а программа находится в потоке 2 (ожидает в sleep (1) ). Теперь я хочу сохранить поток 3, где бы он ни находился, и продолжить выполнение потока 2 (путем выполнения c в gdb).

Я пробовал установить блокировку планировщика на ,но похоже, что это работает не так, как я ожидал. Я нахожусь в потоке 2, я установил блокировку планировщика на , continue пару раз (пока все хорошо, я все еще в потоке 2), переключился на поток 3, установил блокировку планировщика на , continue , и по какой-то причине я вернулся в поток 2 ... когда я не должен быть (согласно моему пониманию). Что-то мне не хватает?

21
задан Prashant Kumar 18 November 2013 в 16:49
поделиться