Câu hỏi Eclipse CDT đa luồng gỡ lỗi không tối ưu - làm thế nào để chạy một chủ đề độc quyền?


Tôi biết câu trả lời cho điều này, tôi đang đặt nó lên đây để những người khác nhìn thấy nó 

Nếu bạn sử dụng Eclipse CDT, bạn có thể hiểu rằng nhật thực không phải là một trình gỡ lỗi, nó chỉ là một ứng dụng front-end, đặc biệt là GDB. Vì vậy, khi gỡ lỗi chương trình C ++, bạn thực sự chỉ sử dụng GDB một cách thoải mái hơn. Nếu bạn phải debug một chương trình đa luồng trong Eclipse CDT, bạn sẽ nhận ra rằng mọi thứ nhanh chóng trở nên bận rộn bởi vì khi bạn nhấn breakpoint, tất cả các luồng dừng lại và khi một cố gắng thực hiện một dòng trong một chuỗi cụ thể, nó cũng chạy các chủ đề khác. Để cho nó hoạt động đúng, các luồng phải có khả năng chạy một cách tùy ý và toàn bộ, để khi lập trình thực thi một dòng, nó chỉ thực thi luồng cụ thể.

Vì vậy, theo mặc định, các thiết lập của gdb theo mặc định sẽ tắt tính năng "scheduler-locking". Nếu bạn gỡ lỗi các ứng dụng đa luồng, bạn sẽ hiểu rằng điều này phải nằm trong GDB để có được hành vi mong muốn. Làm thế nào để chạy lệnh này:

set scheduler-locking on

trong GDB trong nhật thực CDT?


15
2018-05-04 07:36


gốc




Các câu trả lời:


Có thể nếu bạn thêm tập lệnh gdb sau có thể đặt biến khi chương trình dừng và tắt nó nếu bạn tiếp tục:

define hook-step
set scheduler-locking on
end
define hookpost-step
set scheduler-locking off
end
define hook-run
set scheduler-locking off
end
define hook-continue
set scheduler-locking off
end

3
2017-08-02 12:37



Làm cách nào để bạn thực thi kịch bản GDB từ bên trong Eclipse? - rbaleksandar


Ít nhất một cách để làm điều đó chắc chắn giải quyết vấn đề là biết cách điều hướng tập hợp các tính năng khổng lồ mà nhật thực cung cấp. Thông thường, khi một chương trình bắt đầu, eclipse CDT sẽ chuyển cửa sổ giao diện điều khiển (nếu bạn mở nó ra, thường là ở phía dưới) để hiển thị đầu vào / đầu ra của chương trình.

Nhưng bạn có thể thay đổi điều này nếu bạn không biết điều này hình ảnh. Nút đó trên thứ hai đến cuối cùng bên phải màu xanh trông giống như màn hình, bạn có thể chọn bảng điều khiển nhập liệu GDB. Nó cũng được thảo luận trong chủ đề này.

Từ đó chỉ cần gõ lệnh.

GIẢI PHÁP, NHƯNG CẦN GIẢI PHÁP TỐT HƠN

Nhưng bây giờ điều này đã được giải quyết, để giải quyết nó một cách tốt hơn như là một vấn đề của sự kiên nhẫn; phải gõ thiết lập lịch trình khóa trên mỗi khi một chương trình bắt đầu là ngớ ngẩn. Nhưng vấn đề với tải một tập tin gdbinit là tập tin gdbinit được lấy nguồn trước khi nhật thực đã thiết lập chương trình cho gdb để giải quyết. Đây là một vấn đề, vì nó làm cho khung nhìn trình gỡ lỗi treo trong nhật thực, như gdb than phiền. Để hiểu những gì đang xảy ra, hãy thử và kích hoạt gdb, sau đó đưa ra lệnh mà không cần tải một tệp nhị phân để thực thi. Nó không thành công-vậy làm thế nào để thiết lập này như là một tùy chọn đó là dính?


3
2018-05-04 07:43



Xin chào Adam, câu trả lời nào chưa? - ransh
Vâng, tôi đoán những gì tôi đang tìm kiếm là dành cho các nhà phát triển CDT nhật thực để chú ý đến những gì tôi đã nói; Tôi không phải là một lập trình viên nhật thực. Một nút của một số loại sẽ được tốt đẹp - Adam Miller
Cảm ơn, bạn cũng thấy hành vi sau khi xóa tất cả các điểm dừng nó vẫn dừng lại ở cùng một chỗ? - ransh
Tôi không biết chính xác những gì bạn đang hỏi. Vấn đề là với mã đồng thời không có khóa luồng, nếu bạn đặt một điểm ngắt và bất kỳ tình huống nào mà trình gỡ rối can thiệp và ngừng thực thi xảy ra, bạn không bao giờ có thể kiểm soát toàn bộ hệ thống đồng thời như một toàn bộ rất tốt. Vì vậy, nếu tôi đặt một breakpoint trong thread 1.cpp (class local chỉ cho thread đó), và thread 2 đang thi hành đồng thời với luồng 1; sau khi tôi dừng thread 1, một khi tôi bắt đầu lại, thread 2 sẽ thực hiện mỗi lần tôi nhấn tiếp theo trong chủ đề 1. Tôi muốn kiểm soát chi tiết, cho mỗi luồng (khóa lập lịch). Điều này thật đáng kinh ngạc trong nhật thực - Adam Miller