2015-12-23 2 views
1

Недавно я начал использовать 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 
+0

Интересно, что это пробел между -D и CMAKE_BUILD_TYPE, который разбивает его. – SergeyA

+0

@SergeyA Я пробовал '-DCMAKE_BUILD_TYPE = Debug' и, к сожалению, производит тот же результат. Я также переименовал исполняемый файл из 'test' в' test1', потому что я пропустил предупреждение о том, что 'test' был зарезервирован. – user2570465

+0

Вы видели, был ли создан собственный файл make? У него есть -g? – SergeyA

ответ

1

Попробуйте явно устанавливая флаг -g для конфигурации отладки путем добавления
set(CMAKE_CXX_FLAGS_DEBUG "-g") К вашему CMakeLists.txt затем повторно запущен CMake с
-DCMAKE_BUILD_TYPE=Debug

+1

Я пробовал это, но это не сработало, к сожалению. Директория .dSYM все еще не существует. – user2570465

+0

Вы пытались запустить Valgrind с опцией '--dsymutil = yes'? Я не очень разбираюсь в системах сборки для osx, но, согласно [Valgrind's manual] (http://valgrind.org/docs/manual/manual-core.html), этот параметр должен приводить к запуску 'dsymutil' для генерации каталог .dSYM. Это не решает более сложную задачу создания каталога .dSYM из cmake, но похоже, что он должен хотя бы получить работу Valgrind – shay

+0

Еще одна вещь, которую нужно попробовать: Из моего элементарного понимания вещей каталог .dSYM содержит информацию об отладке для xcode проекты. GCC фактически не создает каталог .dSYM, созданный приложением под названием 'dsymutil', используя отладочные символы, предоставленные gcc, и вызывается позже в вашем файле makefile. С cmake вы можете указать тип make-файла, который генерируется с опцией '-G', поэтому возможно что-то вроде ' cmake -G Xcode -D CMAKE_BUILD_TYPE = Debug ..' будет включать шаги dsymutil в результирующий make-файл. – shay

Смежные вопросы