Tôi đang cố gắng để xoa dịu một heisenbug trên một quá trình sử dụng hơn 32 Gb ram và nhấn giới hạn valgrind này, đây là một tùy ý mà có thể tránh được bằng cách biên dịch lại valgrind hoặc là một khó khăn?Tại sao valgrind giới hạn ở 32 Gb trên kiến trúc 64 bit?
Trả lời
Giới hạn là tùy ý và có thể thay đổi bằng cách biên dịch lại valgrind.
Valgrind theo dõi bộ nhớ bằng cách sử dụng mảng thưa thớt 2 cấp. 16 bit của địa chỉ được sử dụng để lập chỉ mục vào một bảng nhập 65536 chứa một con trỏ tới một bản đồ cấp hai, theo dõi một phạm vi không gian địa chỉ (thường là 2¹⁶ bytes = 64KB cho các quy trình 32 bit, 2¹⁹ bytes = 512KB cho Quy trình 64 bit). Vì vậy, tổng số lượng bộ nhớ có thể được theo dõi bởi mảng thưa thớt 2 cấp này là 65536 × kích thước đoạn này. Bằng cách sửa đổi mã, kích thước của các khối này có thể được tăng lên với công suất lớn hơn là 2, với chi phí sử dụng nhiều bộ nhớ hơn để theo dõi hầu hết các phần từng phần.
Trong this message trên valgrind người sử dụng danh sách gửi thư, Julian Seward giải thích làm thế nào để tăng giới hạn từ 32GB đến 128GB:
trong
memcheck/mc_main.c
thay đổiN_PRIMARY_BITS
19
-21
thay đổi các xác nhận ở cuối
memcheck/mc_main.c
tương ứng:
MAX_PRIMARY_ADDRESS
→ 4 * (hiện có giá trị + 1) - 1- cho
MASK(1/2/4/8)
khẳng định, thiết lập để không những tận cùng bên phải hai '1' bit trong khối lãnh đạo 1 bit, ví dụ:MASK(8)
→0xFFFFFFE000000007ULL
Tôi nghĩtrong
coregrind/m_aspacemgr/aspacemgr-linux.c
thay đổiaspacem_maxAddr
từ(Addr)0x800000000 - 1
để(Addr)0x2000000000ULL - 1
.
Cập nhật: Số tiền tối đa bộ nhớ mà Valgrind có thể sử dụng đã tăng lên trong các phiên bản gần đây:
- 32 GB trước khi Valgrind 3,9
- 64 GB Valgrind 3.9 đến 3.12
- 128 GB trong Valgrind 3.13
- 1. Hoạt động trên 64 bit hoạt động trong kiến trúc 32 bit?
- 2. Xác định kiến trúc JRE 32 bit so với 64 bit
- 3. chạy nhị phân 32 bit trên máy 64 bit
- 4. Kích thước của cấu trúc trên 32 bit và 64 bit
- 5. Xác định cấu trúc 32/64 bit trong assembly
- 6. Tại sao điều này nhanh hơn trên 64 bit so với 32 bit?
- 7. Tại sao __sync_add_and_fetch hoạt động với biến 64 bit trên hệ thống 32 bit?
- 8. Hệ điều hành iPhone 64 bit hay 32 bit?
- 9. Tại sao lệnh x86-64 trên thanh ghi 32 bit không phải phần trên của thanh ghi 64 bit đầy đủ?
- 10. 32 bit int * 32 bit int = 64 bit int?
- 11. Giới hạn bộ nhớ 32 bit của Python trên các cửa sổ 64bit
- 12. Máy ảo 32 hoặc 64 bit nhanh hơn trên máy 64 bit (vmware)
- 13. SDK Android 32 bit hoặc 64 bit trên hệ điều hành Windows 64 bit?
- 14. Thêm hỗ trợ 64 bit vào mã 32 bit hiện tại, có khó không?
- 15. Java JDK 32 bit và 64 bit
- 16. Eclipse 32 bit chạy trên 64 bit JVM
- 17. QtCreator trên linux: 32 bit so với 64 bit
- 18. Chạy dll 32 bit trên máy 64 bit trong java
- 19. Biên dịch 32 bit Assembler trên 64 bit ubuntu
- 20. Lỗi AJAX ASP.NET AJAX/32-bit đến 64-bit
- 21. Ứng dụng 32 bit hoặc 64 bit trên hệ điều hành 64 bit?
- 22. Tại sao tôi nên sử dụng JDK 64 bit so với phiên bản 32 bit?
- 23. Xác định xem quy trình PowerShell hiện tại là 32 bit hay 64 bit?
- 24. 64 bit bằng cách phân chia 32 bit
- 25. Tại sao các nhà phát triển .NET cung cấp phiên bản 32-bit/64-bit của các hội đồng .NET?
- 26. Windows có thể xử lý thừa kế qua ranh giới 32 bit/64 bit không?
- 27. Tại sao tôi không thể đọc chính xác giá trị đăng ký 32 bit trong HKCU trên máy 64 bit?
- 28. là bộ nhớ được phân bổ trong JNA (hoặc JNI) bởi mã C bị giới hạn bởi jvm (param -Xmx hoặc kiến trúc 32/64)
- 29. Có thể thiết lập trình biên dịch chéo gcc trên Linux để biên dịch các mục tiêu 64 bit trên kiến trúc 32 bit không?
- 30. ODP Oracle.DataAccess.DLL tham chiếu 32/64 bit
Câu trả lời hay, cảm ơn – piotr