Tôi có chương trình C đa luồng, thường xuyên tạo ra lỗi phân đoạn tại một điểm cụ thể trong chương trình. Khi tôi chạy nó với gdb, không có lỗi nào được hiển thị. Bạn có thể nghĩ ra bất kỳ lý do nào tại sao lỗi có thể xảy ra chỉ khi không sử dụng trình gỡ rối không? Nó khá khó chịu không thể sử dụng nó để tìm ra vấn đề!segfault chỉ khi KHÔNG sử dụng trình gỡ lỗi
Trả lời
Cổ điển Heisenbug. Từ Wikipedia:
Thời gian cũng có thể là một yếu tố trong heisenbugs. Thực hiện một chương trình dưới sự kiểm soát của trình gỡ rối có thể thay đổi thời gian thực hiện của chương trình so với thực thi thông thường. Các lỗi thời gian nhạy cảm như các điều kiện chủng tộc có thể không sinh sản khi chương trình bị chậm lại bởi các dòng nguồn đơn bước trong trình gỡ lỗi. Điều này đặc biệt đúng khi hành vi liên quan đến sự tương tác với một thực thể không dưới sự kiểm soát của một trình gỡ rối, chẳng hạn như khi gỡ lỗi xử lý gói mạng giữa hai máy và chỉ một bộ điều khiển được kiểm soát.
Trình gỡ lỗi có thể thay đổi thời gian và ẩn điều kiện cuộc đua.
Trên Linux, GDB cũng vô hiệu hóa ngẫu nhiên không gian địa chỉ và sự cố của bạn có thể cụ thể để bố trí không gian địa chỉ. Hãy thử (gdb) set disable-randomization off
.
Cuối cùng, ulimit -c unlimited
và gỡ lỗi sau khi chết (đã được Robie đề xuất) có thể hoạt động.
Bằng cách gỡ lỗi, bạn đang thay đổi môi trường đang chạy. Có vẻ như bạn đang xử lý một số loại điều kiện chủng tộc và bằng cách gỡ lỗi, mọi thứ được lên lịch hơi khác nhau để bạn không gặp phải vấn đề. Điều đó, hoặc những thứ đang được lưu trữ một cách hơi khác nhau vì vậy nó không xảy ra. Bạn có thể đặt một số đầu ra gỡ lỗi trong mã để hỗ trợ trong việc tìm ra vấn đề không? Điều đó có thể có ít tác động hơn và cho phép bạn tìm ra vấn đề của mình.
Có lẽ khi sử dụng bộ nhớ gdb
được ánh xạ ở vị trí mà lưu lượng quá/dưới của bạn không bị xáo trộn trên bộ nhớ gây ra sự cố. Hoặc nó có thể là một điều kiện chủng tộc không còn bị vấp ngã nữa. Mặc dù nghe có vẻ không trực quan, bạn phải là chúc mừng chương trình của bạn đủ đẹp để gây tai nạn cho bạn.
Một số gợi ý
tôi đã hoàn toàn có vấn đề này trước đây! Đó là một tình trạng chạy đua, và khi tôi đang bước qua đoạn mã với một trình gỡ rối, luồng tôi đang ở đủ chậm để không kích hoạt tình trạng cuộc đua. Khá tệ.
- 1. Khi nào sử dụng trình gỡ lỗi Python
- 2. Sử dụng better_errors làm trình gỡ lỗi?
- 3. "sử dụng nghiêm ngặt" chỉ trong gỡ lỗi?
- 4. Chỉ sử dụng lệnh in để gỡ lỗi
- 5. Trình gỡ lỗi không thể tiếp tục chạy quá trình. Không thể bắt đầu gỡ lỗi
- 6. Tại sao chương trình gỡ lỗi bị chậm lại quá nhiều khi sử dụng gỡ lỗi nhập phương thức?
- 7. cách sử dụng trình gỡ lỗi ILspy một dll?
- 8. Gỡ lỗi khi sử dụng bộ nhớ cache require.js
- 9. Sử dụng trình gỡ lỗi từ xa Eclipse ném com.sun.jdi.InternalException
- 10. cách gỡ lỗi dữ liệu khi sử dụng json/ajax
- 11. Cách đính kèm trình gỡ lỗi khi tạo quy trình?
- 12. Làm cách nào để sử dụng trình gỡ lỗi gdb MinGW để gỡ lỗi chương trình C++ trong Windows?
- 13. Khi sử dụng trình gỡ lỗi Java trong Intellij, "Drop Frame" có nghĩa là gì?
- 14. Trình gỡ lỗi pudb có thể được sử dụng trên các cửa sổ không?
- 15. Visual Studio: chỉnh sửa xaml trong khi gỡ lỗi (không ngừng gỡ lỗi)
- 16. Không thể kết nối với Glassfish bằng cách sử dụng bất kỳ trình gỡ lỗi
- 17. Mã chỉ chạy đúng khi bước qua nó bằng trình gỡ lỗi?
- 18. Trình gỡ lỗi VBScript
- 19. Trình gỡ lỗi JavaScript
- 20. Không thể gỡ lỗi kiểm tra bằng Resharper - Không thể chạy trình gỡ lỗi
- 21. REMOTELY Gỡ lỗi PHP Sử dụng Eclipse
- 22. Có thể gỡ lỗi các bãi lõi khi sử dụng Java JNI không?
- 23. Trình gỡ lỗi VS2008 Hàng
- 24. Có trình gỡ lỗi URL Google Plus giống như trình gỡ lỗi cho Facebook không?
- 25. bắt segfault, bộ nhớ không ánh xạ lỗi
- 26. ToString() chỉ hữu ích để gỡ lỗi?
- 27. Đặt trình duyệt mặc định khi gỡ lỗi WPF?
- 28. Trình gỡ lỗi url Django
- 29. nhắn gdb lạ khi gỡ lỗi chương trình C++
- 30. xCode cho lỗi EXC_BAD_ACCESS của iPhone chỉ xảy ra khi bước qua trình gỡ rối?
Loại lỗi này được gọi là ["Heisenbug"] (http://en.wikipedia.org/wiki/Heisenbug#Heisenbug) và có thể có nhiều nguyên nhân. –
Lỗi có xảy ra liên quan đến quản lý cửa sổ và/hoặc User32.dll không? – Mehrdad
Tôi gặp sự cố như vậy, chương trình của tôi chỉ bị lỗi với GDB. Vấn đề là một biến thành viên lớp không được nhận dạng vẫn nhận được giá trị 0 khi tôi chạy chương trình của mình, nhưng khi tôi chạy nó trong GDB nó có một số giá trị lớn bị phân đoạn khi tôi sử dụng nó làm chỉ mục mảng. – GWW