2011-07-17 29 views
13

いつどのスレッドを実行するかを制御してマルチスレッドプログラムをデバッグしたい。私は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)で行にブレークポイントを設定します。ここでは

は、私が書いたプログラム例です。その後、私はプログラムを実行します。私は3つのスレッド(スレッド2と3はpthreadsです)を取得し、プログラムはスレッド2( sleep(1)で待機しています)にあります。さて、私はスレッド3をそのままにしておき、スレッド2をステップ実行し続けたい(gdbに cを実行することによって)。

私が試したことはset scheduler-locking onですが、期待通りに動作していないようです。私はスレッド2、私はset scheduler-locking oncontinueカップル(これまではとても良い、私はまだスレッド2にある)、スレッド3に切り替え、set scheduler-locking oncontinue、何らかの理由で、私はスレッド2に戻ります...私は(私の理解によれば)なるべきではありません。私が紛失しているものはありますか?

答えて

8

スケジューラロックは、シングルステップまたは次のステップでのみ便利です。現在のスレッドを続行すると、それらはすべて実行され、ブレークポイントに達する次のスレッドがプロンプトを取得します。あなたがスレッド3にあるいったん

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

ので、他のスレッドが停止され、そして限り、あなたは/次のステップとして、彼らは実行されません。少なくとも、それは手動の私の解釈です。しかし、一度続行すると、すべて実行され、sleep(1)のブレークポイントに当たる次のスレッド(例では2)がプロンプトを取得します。

多分、すべてのスレッドがスリープ状態になることがありますが、一度に1つだけ続けるようにしてください。

+0

リンクありがとうございました...スレッド3で 'set scheduler-locking on 'の後に' next'しても、スレッド2に制御を戻します。(I ' 'step'ですが、ライブラリコード内のすべての命令を実行するのは非常に苦痛です。)このトリックを行う' set scheduler-locking on '以外のコマンドはありますか? –

+0

良い方法はないようですが、問題を明確にしました。だから、この答えを受け入れる。 –

+0

'set scheduler-locking on 'を使うことはOSに依存すると言われています。私のシステムでうまく動作しているようです(Linux 4.4.0カーネル、gdb 7.11.1、Ubuntu 16.04) –

2

TazMainiacによれば、スケジューラロックはシングルステッピングには便利ですが、「モード」は「ステップ」に設定する必要があります。

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

ステップモードは、シングルステップのために最適化します。

set scheduler-locking step 

あなたが同じことを言及TazMainiacが提供するリンクを参照することができます。他のスレッド は、 がステッピングしている間に現在のスレッドをプリエンプトすることにより、「プロンプトを押さえる」ことを停止します。

関連する問題