いつどのスレッドを実行するかを制御してマルチスレッドプログラムをデバッグしたい。私はC++とgdbを使用しています。私はメインスレッド(サンプルプログラム用)のほかに2つのスレッドを持っていて、他のスレッドを停止したまま1つのスレッドをデバッグしたい。gdbデバッグを一度に1つのスレッドに制限する方法
#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)
で行にブレークポイントを設定します。ここでは
sleep(1)
で待機しています)にあります。さて、私はスレッド3をそのままにしておき、スレッド2をステップ実行し続けたい(gdbに
c
を実行することによって)。
私が試したことはset scheduler-locking on
ですが、期待通りに動作していないようです。私はスレッド2、私はset scheduler-locking on
、continue
カップル(これまではとても良い、私はまだスレッド2にある)、スレッド3に切り替え、set scheduler-locking on
、continue
、何らかの理由で、私はスレッド2に戻ります...私は(私の理解によれば)なるべきではありません。私が紛失しているものはありますか?
リンクありがとうございました...スレッド3で 'set scheduler-locking on 'の後に' next'しても、スレッド2に制御を戻します。(I ' 'step'ですが、ライブラリコード内のすべての命令を実行するのは非常に苦痛です。)このトリックを行う' set scheduler-locking on '以外のコマンドはありますか? –
良い方法はないようですが、問題を明確にしました。だから、この答えを受け入れる。 –
'set scheduler-locking on 'を使うことはOSに依存すると言われています。私のシステムでうまく動作しているようです(Linux 4.4.0カーネル、gdb 7.11.1、Ubuntu 16.04) –