Недавно я начал использовать CMake, и мне не удалось выяснить, как заставить мои символы отладки работать для Valgrind. Итак, я сделал тестовый проект, чтобы продемонстрировать свою проблему. Без CMake, я бы просто скомпилировать с -g:Символы отладки CMake отсутствуют
g++ -std=c++11 -g main.cpp -o test
и я получаю test.dSYM
каталог, который я хочу. По How do you set GDB debug flag with cmake?, чтобы получить флаг -g, я должен использовать аргумент
-D CMAKE_BUILD_TYPE=Debug
Так что это то, что я пытался. В папке с именем Testing
, я создал тестовый файл main.cpp
со следующим содержимым:
#include <iostream>
using std::cout;
int main(int argc , const char* argv[]) {
int* leak = new int;
int arr[] = { 1 , 2 , 3 , 4 };
for (int i : arr) {
cout << i << "\n";
}
return 0;
}
Внутри Testing
, я также создал файл CMakeLists.txt
со следующим содержимым:
cmake_minimum_required(VERSION 3.1)
project(Testing)
add_executable(test1 main.cpp)
set_property(TARGET test1 PROPERTY CXX_STANDARD 11)
set_property(TARGET test1 PROPERTY CXX_STANDARD_REQUIRED ON)
Затем я создал новый каталог, Testing/cmake_build
и в этом каталоге я побежал следующие команды:
Testing/cmake_build$ cmake -D CMAKE_BUILD_TYPE=Debug ..
Testing/cmake_build$ make
Testing/cmake_build$ valgrind --leak-check=yes ./test
И Valgrind жалуется, что каталог dSYM отсутствует. Я сам огляделся и не нашел его. Таким образом, я не получаю номера строк в выходном сигнале проверки утечки, и я не могу отлаживать проект:
==2388== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==2388== Command: ./test
==2388==
--2388-- ./test:
--2388-- dSYM directory is missing; consider using --dsymutil=yes
1
2
3
4
==2388==
==2388== HEAP SUMMARY:
==2388== in use at exit: 29,443 bytes in 378 blocks
==2388== total heap usage: 472 allocs, 94 frees, 36,027 bytes allocated
==2388==
==2388== 4 bytes in 1 blocks are definitely lost in loss record 1 of 76
==2388== at 0x47F1: malloc (vg_replace_malloc.c:300)
==2388== by 0x4928D: operator new(unsigned long) (in /usr/lib/libc++.1.dylib)
==2388== by 0x1000012E5: main (in ./test)
==2388==
==2388== LEAK SUMMARY:
==2388== definitely lost: 4 bytes in 1 blocks
==2388== indirectly lost: 0 bytes in 0 blocks
==2388== possibly lost: 0 bytes in 0 blocks
==2388== still reachable: 4,096 bytes in 1 blocks
==2388== suppressed: 25,343 bytes in 376 blocks
==2388== Reachable blocks (those to which a pointer was found) are not shown.
==2388== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==2388==
Он должен сказать
==2530== by 0x1000012E5: main (main.cpp:5)
Может кто-нибудь показать мне, как я могу использовать CMake так что я получаю каталог dSYM? Благодарю.
Edit 1 (сделать все команды):
Здесь делают все команды, который был сгенерирован в моем Makefile:
all: cmake_check_build_system
$(CMAKE_COMMAND) -E cmake_progress_start <Path>/Testing/cmake_build/CMakeFiles <Path>/Testing/cmake_build/CMakeFiles/progress.marks
$(MAKE) -f CMakeFiles/Makefile2 all
$(CMAKE_COMMAND) -E cmake_progress_start <Path>/Testing/cmake_build/CMakeFiles 0
Edit 2 (все команды Makefile2 в):
# Target rules for target CMakeFiles/test1.dir
# All Build rule for target.
CMakeFiles/test1.dir/all:
$(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/depend
$(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/build
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --progress-dir=<Path>/Testing/cmake_build/CMakeFiles --progress-num=1,2 "Built target test1"
.PHONY : CMakeFiles/test1.dir/all
# Include target in all.
all: CMakeFiles/test1.dir/all
Редактировать 3 (CmakeFiles/test1.dir/build.make):
# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 3.4
# Delete rule output on recipe failure.
.DELETE_ON_ERROR:
#=============================================================================
# Special targets provided by cmake.
# Disable implicit rules so canonical targets will work.
.SUFFIXES:
# Remove some rules from gmake that .SUFFIXES does not remove.
SUFFIXES =
.SUFFIXES: .hpux_make_needs_suffix_list
# Suppress display of executed commands.
$(VERBOSE).SILENT:
# A target that is always out of date.
cmake_force:
.PHONY : cmake_force
#=============================================================================
# Set environment variables for the build.
# The shell in which to execute make rules.
SHELL = /bin/sh
# The CMake executable.
CMAKE_COMMAND = /usr/local/bin/cmake
# The command to remove a file.
RM = /usr/local/bin/cmake -E remove -f
# Escaping for special characters.
EQUALS = =
# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = <Path>/Desktop/Testing
# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = <Path>/Desktop/Testing/cmake_build
# Include any dependencies generated for this target.
include CMakeFiles/test1.dir/depend.make
# Include the progress variables for this target.
include CMakeFiles/test1.dir/progress.make
# Include the compile flags for this target's objects.
include CMakeFiles/test1.dir/flags.make
CMakeFiles/test1.dir/main.cpp.o: CMakeFiles/test1.dir/flags.make
CMakeFiles/test1.dir/main.cpp.o: ../main.cpp
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=<Path>/Desktop/Testing/cmake_build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object CMakeFiles/test1.dir/main.cpp.o"
/Applications/Xcode6-Beta5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/test1.dir/main.cpp.o -c <Path>/Desktop/Testing/main.cpp
CMakeFiles/test1.dir/main.cpp.i: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/test1.dir/main.cpp.i"
/Applications/Xcode6-Beta5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E <Path>/Desktop/Testing/main.cpp > CMakeFiles/test1.dir/main.cpp.i
CMakeFiles/test1.dir/main.cpp.s: cmake_force
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/test1.dir/main.cpp.s"
/Applications/Xcode6-Beta5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S <Path>/Desktop/Testing/main.cpp -o CMakeFiles/test1.dir/main.cpp.s
CMakeFiles/test1.dir/main.cpp.o.requires:
.PHONY : CMakeFiles/test1.dir/main.cpp.o.requires
CMakeFiles/test1.dir/main.cpp.o.provides: CMakeFiles/test1.dir/main.cpp.o.requires
$(MAKE) -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/main.cpp.o.provides.build
.PHONY : CMakeFiles/test1.dir/main.cpp.o.provides
CMakeFiles/test1.dir/main.cpp.o.provides.build: CMakeFiles/test1.dir/main.cpp.o
# Object files for target test1
test1_OBJECTS = \
"CMakeFiles/test1.dir/main.cpp.o"
# External object files for target test1
test1_EXTERNAL_OBJECTS =
test1: CMakeFiles/test1.dir/main.cpp.o
test1: CMakeFiles/test1.dir/build.make
test1: CMakeFiles/test1.dir/link.txt
@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=<Path>/Desktop/Testing/cmake_build/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable test1"
$(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/test1.dir/link.txt --verbose=$(VERBOSE)
# Rule to build all files generated by this target.
CMakeFiles/test1.dir/build: test1
.PHONY : CMakeFiles/test1.dir/build
CMakeFiles/test1.dir/requires: CMakeFiles/test1.dir/main.cpp.o.requires
.PHONY : CMakeFiles/test1.dir/requires
CMakeFiles/test1.dir/clean:
$(CMAKE_COMMAND) -P CMakeFiles/test1.dir/cmake_clean.cmake
.PHONY : CMakeFiles/test1.dir/clean
CMakeFiles/test1.dir/depend:
cd <Path>/Desktop/Testing/cmake_build && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" <Path>/Desktop/Testing <Path>/Desktop/Testing <Path>/Desktop/Testing/cmake_build <Path>/Desktop/Testing/cmake_build <Path>/Desktop/Testing/cmake_build/CMakeFiles/test1.dir/DependInfo.cmake --color=$(COLOR)
.PHONY : CMakeFiles/test1.dir/depend
Edit 4 (сделать подробный вывод):
/usr/local/bin/cmake -H<Path>/Desktop/Testing -B<Path>/Desktop/Testing/cmake_build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/local/bin/cmake -E cmake_progress_start <Path>/Desktop/Testing/cmake_build/CMakeFiles <Path>/Desktop/Testing/cmake_build/CMakeFiles/progress.marks
/Applications/Xcode6-Beta5.app/Contents/Developer/usr/bin/make -f CMakeFiles/Makefile2 all
/Applications/Xcode6-Beta5.app/Contents/Developer/usr/bin/make -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/depend
cd <Path>/Desktop/Testing/cmake_build && /usr/local/bin/cmake -E cmake_depends "Unix Makefiles" <Path>/Desktop/Testing <Path>/Desktop/Testing <Path>/Desktop/Testing/cmake_build <Path>/Desktop/Testing/cmake_build <Path>/Desktop/Testing/cmake_build/CMakeFiles/test1.dir/DependInfo.cmake --color=
/Applications/Xcode6-Beta5.app/Contents/Developer/usr/bin/make -f CMakeFiles/test1.dir/build.make CMakeFiles/test1.dir/build
Интересно, что это пробел между -D и CMAKE_BUILD_TYPE, который разбивает его. – SergeyA
@SergeyA Я пробовал '-DCMAKE_BUILD_TYPE = Debug' и, к сожалению, производит тот же результат. Я также переименовал исполняемый файл из 'test' в' test1', потому что я пропустил предупреждение о том, что 'test' был зарезервирован. – user2570465
Вы видели, был ли создан собственный файл make? У него есть -g? – SergeyA