Подтвердить что ты не робот

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

Я хочу отлаживать многопоточную программу, контролируя, какие потоки выполняются, когда. Я использую С++ и 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... когда я не должен был (согласно моему пониманию). Есть что-то, чего я не хватает?

4b9b3361

Ответ 1

Похоже, что блокировка планировщика полезна только при однократном или следующем. После того, как вы продолжите свой текущий поток, все они запустится, а следующий поток, чтобы попасть в точку останова, захватит подсказки. По крайней мере, моя интерпретация руководства:

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

Итак, как только вы находитесь в потоке 3, остальные потоки останавливаются, и пока вы на шаг/дальше, они не будут работать. Но как только вы продолжаете, все они запускаются, а следующий поток (2 в вашем примере), который попадает в точку прерывания сна (1), будет захватывать приглашение.

Возможно, пусть все потоки попадут в сон, но затем продолжайте только один из них за раз.

Ответ 2

Как сказал TazMainiac, блокировка планировщика полезна для одиночного шага, но "режим" должен быть установлен на "шаг".

set scheduler-locking step

Вы можете ссылаться на ссылку, предоставленную TazMainiac, которая упоминает то же самое:

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

Режим шага оптимизируется для одношаговой. Он останавливает другие потоки от "захвата подсказки", вытесняя текущую нить, пока вы степпируют.