2011-07-17 61 views
13

Tôi muốn gỡ lỗi chương trình đa luồng bằng cách kiểm soát chuỗi nào thực hiện khi nào. Tôi đang sử dụng C++ và gdb. Tôi có hai chủ đề bên cạnh các chủ đề chính (cho các chương trình ví dụ) và tôi muốn gỡ lỗi một sợi trong khi giữ khác dừng lại.Làm thế nào để hạn chế gdb gỡ lỗi thành một chuỗi tại một thời điểm

Dưới đây là chương trình ví dụ tôi đã viết:

#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); 

} 

tôi chạy gdb và thiết lập các breakpoint tại dòng với sleep(1). Sau đó, tôi chạy chương trình. Tôi nhận được ba chủ đề (thread 2 và 3 là pthreads) và chương trình đang ở thread 2 (chờ ở sleep(1)). Bây giờ, tôi muốn giữ nguyên chuỗi 3 ở bất kỳ đâu, và tiếp tục bước qua chuỗi 2 (bằng cách thực hiện c trong gdb).

Điều tôi đã thử là set scheduler-locking on, nhưng dường như không hoạt động như tôi mong đợi. Tôi đang ở chủ đề 2, tôi set scheduler-locking on, continue một vài lần (cho đến nay rất tốt, tôi vẫn đang ở trong chuỗi 2), chuyển sang chuỗi 3, set scheduler-locking on, continue và vì một lý do nào đó, tôi quay lại chuỗi 2 ... khi tôi không nên (theo sự hiểu biết của tôi). Có điều gì tôi đang thiếu?

Trả lời

8

Có vẻ như tính năng khóa lịch biểu chỉ hữu ích khi bạn thực hiện một bước hoặc tiếp theo. Khi bạn tiếp tục chuỗi hiện tại của mình, tất cả đều chạy và chuỗi tiếp theo để đạt điểm ngắt sẽ lấy lời nhắc. Ít nhất, đó là sự giải thích của tôi về hướng dẫn:

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

Vì vậy, một khi bạn đang ở trong chủ đề 3, các chủ đề khác được dừng lại, và chừng nào bạn bước/tiếp theo, họ sẽ không chạy. Nhưng một khi bạn tiếp tục, tất cả chúng chạy, và thread tiếp theo (2 trong ví dụ của bạn) mà chạm vào điểm break trong giấc ngủ (1) sẽ lấy dấu nhắc.

Có thể cho phép tất cả các chủ đề nhấn vào giấc ngủ, nhưng sau đó chỉ tiếp tục một trong số chúng tại một thời điểm.

+0

Cảm ơn bạn đã liên kết ... nó chỉ ra rằng ngay cả khi tôi 'next' sau khi' đặt lịch trình khóa trên' trong chuỗi 3, nó vẫn chuyển điều khiển trở lại luồng 2. (Nó không nếu tôi ' step', nhưng nó rất đau đớn để bước qua tất cả các hướng dẫn trong mã thư viện.) Có lệnh nào khác ngoài 'set scheduler-locking on' có thực hiện thủ thuật không? –

+0

Có vẻ như không phải là cách tốt hơn và bạn đã làm rõ vấn đề. Vì vậy, chấp nhận câu trả lời này. –

+0

Sử dụng 'set scheduler-locking on' được cho là phụ thuộc vào hệ điều hành. Dường như làm việc tốt trên hệ thống của tôi mặc dù (hạt nhân Linux 4.4.0, gdb 7.11.1, Ubuntu 16.04) –

2

Như TazMainiac đã nói, khóa lên lịch là hữu ích cho bước đơn, nhưng "chế độ" phải được đặt thành "bước".

set scheduler-locking step 

Bạn có thể tham khảo các liên kết được cung cấp bởi TazMainiac mà đề cập như nhau:

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

Phương thức bước tối ưu hóa cho đơn bước. Nó dừng các chủ đề khác từ "thu giữ lời nhắc" bằng cách đặt trước chuỗi hiện tại trong khi bạn đang thực hiện.

Các vấn đề liên quan