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?
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? –
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. –
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) –