2012-06-18 10 views
8

Tôi có một chương trình C++/Linux, trong vòng 2-3 giây sau khi chạy bắt đầu khạc nhổ lỗi std::bad alloc trên RAM 32GB (và được khởi động lại bởi trình bao bọc). Những gì tôi thực sự quan tâm là giải quyết vấn đề này, nhưng tôi muốn đi từng bước và xây dựng sự tự tin của tôi trong sự hiểu biết của tôi về vấn đề này.nhận std :: bad_alloc error; Làm thế nào để xác minh chéo rằng hệ điều hành thực sự đang hết bộ nhớ

Có vẻ như hệ thống không thể cấp phát bộ nhớ cho yêu cầu new (điều này sẽ xảy ra khi hệ điều hành hết bộ nhớ). Trong khi chương trình đang chạy, trên một thiết bị đầu cuối khác, tôi chạy lệnh sar với khoảng thời gian nhỏ nhất có thể (1 giây), nhưng tôi thấy rằng kbcached là ~ 24GB bộ nhớ. Tại sao hệ điều hành không thể giải phóng bộ nhớ đệm và làm cho bộ nhớ đó có sẵn cho yêu cầu new? Hoặc 1 giây là quá nhiều thời gian (so với các chương trình chạy nhanh như thế nào) hoặc tôi đang làm điều gì sai ở đây.

Về cơ bản tôi muốn xác minh chéo và xác định rằng hệ điều hành thực sự hết bộ nhớ và do đó không thể cấp phát bộ nhớ và sau đó thực hiện mọi thứ từ thời điểm này. Làm thế nào để làm nó?

Lý tưởng nhất, tôi muốn có số liệu thống kê hệ thống ngay tại thời điểm khi cấp phát bộ nhớ thất bại, giống như bao nhiêu bộ nhớ đệm, tổng sử dụng hết bộ nhớ vv

+2

Chỉ cần một lưu ý .. nó không có gì để làm với cách bạn có RAM, nó phụ thuộc vào bao nhiêu bộ nhớ miễn phí có mặt trong quá trình không gian địa chỉ bộ nhớ ảo. Tôi không biết lệnh để kiểm tra quá trình cấp phát bộ nhớ ảo mặc dù. – Naveen

+0

Tôi đoán điều này sẽ là hệ điều hành cụ thể. – sharptooth

+0

Quy trình của bạn đã phân bổ bao nhiêu bộ nhớ? Quy trình của bạn có những ràng buộc gì? Có 32 bit không? –

Trả lời

2

Nếu bạn thực sự muốn nhìn thấy như thế nào bộ nhớ của quá trình của bạn được phân bổ , bạn có thể đặt điểm ngắt với gdb khi ngoại lệ được ném. Khi nó được, kiểm tra quá trình với một công cụ như pmap, có thể hiển thị cho bạn thông tin bổ sung về cách quá trình sử dụng bộ nhớ.

Nếu nó quá nguyên thủy (và nó sẽ nhanh chóng, pmap là khá nguyên thủy), valgrind bao gồm Massif và nhiều tiện ích khác để chẩn đoán sử dụng bộ nhớ, sử dụng CPU và các vấn đề thời gian chạy khác.

+1

Đáng chú ý (trong trường hợp này), công cụ khối lượng valgrind. Massif theo dõi phân bổ và cho phép một để có được một đồ thị của việc tiêu thụ bộ nhớ trên một dòng thời gian; và cho mỗi ảnh chụp nhanh, xác định nơi phân bổ đến từ đâu. –

+0

@MatthieuM. Có lẽ bình luận của bạn phải là câu trả lời của riêng mình? – RedX

+1

@RedX: Không có gì khác để nói, vì vậy tôi sẽ để Steven thêm chi tiết vào câu trả lời của chính anh ấy nếu anh ấy thấy chúng đáng giá. –