2012-02-16 38 views
19

Tôi muốn viết một CMakeLists.txt để tôi có thể chạy thử nghiệm bình thường hoặc với valgrind. Tôi đã thấy nhiều về tích hợp ctest với valgrind nhưng tất cả với giả định rằng bạn muốn thiết lập một máy chủ để gửi kết quả kiểm tra đến một bảng điều khiển phi tiêu. Tôi chỉ muốn chạy các bài kiểm tra trên máy của tôi và xem kết quả trên dòng lệnh.Làm cách nào để ctest chạy một chương trình với valgrind mà không có phi tiêu?

Nếu tôi phải thực hiện cmake -D VALGRIND = ON, nhưng tôi muốn tạo các thử nghiệm có tên là "foo" và "valgrind_foo" nếu có thể.

Trả lời

18

Tôi sử dụng valgrind để kiểm tra bộ nhớ của mình. Để cấu hình valgrind, tôi xác định các biến sau trong hệ thống xây dựng của tôi:

find_program(MEMORYCHECK_COMMAND valgrind) 
set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full") 

Ngoài ra, trong đó là valgrind tập ức chế của tôi:

set(MEMORYCHECK_SUPPRESSIONS_FILE "${PROJECT_SOURCE_DIR}/valgrind_suppress.txt") 

Sau khi bạn viết các file CMakeLists.txt và định cấu hình một cách chính xác valgrind trong đó, bạn có thể chạy lệnh sau:

cmake -G ... (to configure your build) 
ctest -D ExperimentalBuild (this will build your code) 
ctest -R testName -D ExperimentalTest (just runs the test) 
ctest -R testName -D ExperimentalMemCheck (to run the test under valgrind) 

Điều này sẽ lừa hệ thống xây dựng của bạn chạy thử nghiệm tự động hóa cục bộ. Hãng này hy vọng bạn để chạy:

ctest -R testName -D ExperimentalSubmit 

tới, để trình (mặc định hoặc bạn) Bảng điều khiển, nhưng bạn không cần phải đi qua bước này để chạy những gì bạn muốn. Các kết quả sẽ được lưu trữ trong thư mục Testing/Temporary /.

+0

Làm thế nào để bạn "cấu hình valgrind một cách chính xác trong họ"? – ibizaman

+0

Câu hỏi hay ... Tôi đã chỉnh sửa câu trả lời. – KlingonJoe

6

Có vẻ như sau đây là đủ. Tôi đã không sử dụng riêng biệt trước đây, đó là sự ngu ngốc của tôi.

function(add_memcheck_test name binary) 
    set(memcheck_command "${CMAKE_MEMORYCHECK_COMMAND} ${CMAKE_MEMORYCHECK_COMMAND_OPTIONS}") 
    separate_arguments(memcheck_command) 
    add_test(${name} ${binary} ${ARGN}) 
    add_test(memcheck_${name} ${memcheck_command} ./${binary} ${ARGN}) 
endfunction(add_memcheck_test) 

function(set_memcheck_test_properties name) 
    set_tests_properties(${name} ${ARGN}) 
    set_tests_properties(memcheck_${name} ${ARGN}) 
endfunction(set_memcheck_test_properties) 
+1

Điều này có vẻ đơn giản hơn tạo thí điểm xây dựng. – aisbaa

0

trường hợp của tôi là đủ đơn giản mà tôi chỉ được sử dụng một mục tiêu tùy chỉnh:

project(bftest) 

add_executable(bftest main.c) 

target_link_libraries(bftest LINK_PUBLIC bf) 

find_program(VALGRIND "valgrind") 
if(VALGRIND) 
    add_custom_target(valgrind 
     COMMAND "${VALGRIND}" --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=20 --track-fds=yes $<TARGET_FILE:bftest>) 
endif() 
Các vấn đề liên quan