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
Câu trả lời hay, cảm ơn – piotr