Как ограничить отладку GDB одним потоком за раз - PullRequest
20 голосов
/ 17 июля 2011

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

Ответы [ 2 ]

9 голосов
/ 17 июля 2011

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

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

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

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

7 голосов
/ 31 мая 2017

Как сказал TazMainiac, блокировка планировщика полезна для одного шага, но «mode» должен быть установлен на «step».

set scheduler-locking step

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

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

Шаговый режим оптимизирован для одноступенчатого.Он останавливает другие потоки от «захвата приглашения», прерывая текущий поток, пока вы шагаете.

...