2011-09-06 33 views

Trả lời

26

Không có "quy trình bên trong" vì cả bản thân valgrind và chương trình máy khách đang chạy trong một quy trình.

Tín hiệu được gửi tới quy trình đó sẽ được gửi đến chương trình khách hàng như bình thường. Nếu tín hiệu gây ra quá trình để terinate sau đó xử lý thoát bình thường của valgrind sẽ chạy và (ví dụ) báo cáo bất kỳ rò rỉ.

Vì vậy, ví dụ, nếu chúng ta bắt đầu valgrind trên một lệnh ngủ:

bericote [~] % valgrind sleep 240 
==9774== Memcheck, a memory error detector 
==9774== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. 
==9774== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info 
==9774== Command: sleep 240 
==9774== 

sau đó giết lệnh rằng:

bericote [~] % kill -TERM 9774 

sau đó quá trình sẽ thoát ra và xử lý thoát valgrind sẽ chạy:

==9774== 
==9774== HEAP SUMMARY: 
==9774==  in use at exit: 0 bytes in 0 blocks 
==9774== total heap usage: 30 allocs, 30 frees, 3,667 bytes allocated 
==9774== 
==9774== All heap blocks were freed -- no leaks are possible 
==9774== 
==9774== For counts of detected and suppressed errors, rerun with: -v 
==9774== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6) 
[1] 9774 terminated valgrind sleep 240 

Ngoại lệ duy nhất là dành cho kill -9 như trong trường hợp đó cess bị giết bởi hạt nhân mà không bao giờ được thông báo về tín hiệu để valgrind không có cơ hội để làm bất cứ điều gì.

+1

Tôi đã thử 'kill -SIGTERM' trước khi hỏi, nhưng nó đã được dùng một thời gian dài reaaally cho valgrind để ngăn chặn (~ 10 phút), vì vậy tôi nghi ngờ nó sẽ không hoạt động. Cảm ơn câu trả lời của bạn. –

+0

Sự chậm trễ là quét tất cả bộ nhớ được phân bổ đang cố gắng giải quyết nếu có bất kỳ rò rỉ nào - có thể mất nhiều thời gian hơn bình thường vì một chương trình đang chạy có khả năng có nhiều bộ nhớ hơn cấp phát. – TomH

+6

Điều này không đúng trên OS X 10.7.5 và valgrind-3.8.1. valgrind sẽ vui vẻ bỏ qua việc giết người. –

Các vấn đề liên quan