我试图在Ubuntu上使用VS Code调试C程序.我已成功构建项目.我使用bin / show dat命令从终端调用它并且它可以工作.
在VS Code中,我安装了C调试工具,而不是创建launch.json和tasks.json.这两个文件将在下面附上.
现在我可以按F5成功启动该程序,效果很好.但是主要功能第一行的断点没有被击中.
任何人都可以给我一些建议我该如何解决这个问题?
感谢您的时间.如果需要更多信息,请告诉我.
文件launch.json的内容
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/bin/show",
"preLaunchTask": "build",
"args": ["${workspaceFolder}/dat"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}
文件tasks.json的内容
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "shell",
"command": "make"
}
]
}
调试控制台的内容如下
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
=cmd-param-changed,param="pagination",value="off"
Stopped due to shared library event (no libraries added or removed)
Loaded '/lib64/ld-linux-x86-64.so.2'. Symbols loaded.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Breakpoint 1, 0x00000000004243a0 in main ()
使用MakeFile和CMakeLists.txt进行更新
生成文件
all: .configured
cmake --build .build
.PHONY: test
test:
cmake -H. -B.build
CTEST_OUTPUT_ON_FAILURE=true cmake --build .build --target test
config: .build
ccmake -H. -B.build
touch .configured
.configured: .build
ifeq ($(CMAKE_GENERATOR),Ninja)
cmake -H. -B.build -G "Ninja"
else
cmake -H. -B.build -G "Unix Makefiles"
endif
touch .configured
.build:
mkdir -p .build
clean: .build
cmake --build .build --target clean
-rm -rf .build
rm -f .configured
DOC = doc/
docu: docu_html docu_latex docu_hl
echo
echo
echo + Reference documentation generated: $(DOC)html/index.html
echo + Reference documentation generated: $(DOC)refman.pdf
echo + Highlevel documentation generated: $(DOC)documentation_HL.pdf
echo
docu_html:
doxygen doc/doxygen.cfg
cd $(DOC) ; zip -q html.zip html/*
echo
echo
docu_latex:
$(MAKE) -C $(DOC)latex
cd $(DOC)latex ; dvips refman
cd $(DOC)latex ; ps2pdf14 refman.ps refman.pdf
cp $(DOC)latex/refman.pdf $(DOC)
docu_hl: $(DOC)high_level_doc/documentation.tex
cd $(DOC)high_level_doc ; latex documentation.tex
cd $(DOC)high_level_doc ; bibtex documentation
cd $(DOC)high_level_doc ; latex documentation.tex
cd $(DOC)high_level_doc ; dvips documentation
cd $(DOC)high_level_doc ; ps2pdf14 documentation.ps ../documentation_HL.pdf
的CMakeLists.txt
cmake_minimum_required (VERSION 2.8.2)
project (3DTK)
if(POLICY CMP0025)
#necessary to build with custom clang on macOS
cmake_policy(SET CMP0025 NEW)
endif()
set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/3rdparty/CMakeModules" ${CMAKE_MODULE_PATH})
# cmake no longer defines WIN32 on cygwin
set(CMAKE_LEGACY_CYGWIN_WIN32 0) # remove when cmake >= 2.8.4 is required
# On Windows, the symbols of a dynamic library have to be explicitly exported
# using __declspec(dllexport) or otherwise the library will not even be built.
# To avoid having to modify our headers, we just force the same behaviour as
# under Unix
if (MSVC)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
endif()
# Hide CMake variables
set (CMAKE_INSTALL_PREFIX "/usr/local" CACHE INTERNAL "" FORCE)
set (CMAKE_BUILD_TYPE "" CACHE INTERNAL "" FORCE)
# being able to set the output directory to a different one than the default
# (the source directory) is important for platforms like windows, where the
# produced binaries cannot be run if being placed in certain locations (like on
# a network drive)
set(OUTPUT_DIRECTORY "${PROJECT_SOURCE_DIR}" CACHE PATH "The directory where the output will be placed into lib, obj and bin subdirectories (default: ${PROJECT_SOURCE_DIR})" )
# Set output directories for libraries and executables
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY}/lib )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY}/obj )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIRECTORY}/bin )
# Set output directories for multi-config builds (like with MSVC)
foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} )
string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG )
set( CMAKE_LIBRARY_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${OUTPUT_DIRECTORY}/lib )
set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${OUTPUT_DIRECTORY}/obj )
set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${OUTPUT_DIRECTORY}/bin )
endforeach( OUTPUTCONFIG CMAKE_CONFIGURATION_TYPES )
include(CheckSymbolExists)
check_symbol_exists(mmap sys/mman.h HAVE_MMAP)
check_symbol_exists(mkstemp stdlib.h HAVE_MKSTEMP)
set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
check_symbol_exists(fallocate fcntl.h HAVE_FALLOCATE)
set(CMAKE_REQUIRED_DEFINITIONS)
if(HAVE_MMAP AND HAVE_MKSTEMP AND HAVE_FALLOCATE)
add_definitions(-DWITH_MMAP_SCAN)
endif()
#include_directories(OPENGL_INCLUDE_DIR)
if(WIN32)
# Tells the config system not to automatically select which libraries to
# link against. Normally if a compiler supports #pragma lib, then the
# correct library build variant will be automatically selected and linked
# against, simply by the act of including one of that library's headers.
# This macro turns that feature off.
add_definitions(-DBOOST_ALL_NO_LIB)
# Forces all libraries that have separate source, to be linked as dll's
# rather than static libraries on Microsoft Windows (this macro is used to
# turn on __declspec(dllimport) modifiers, so that the compiler knows which
# symbols to look for in a dll rather than in a static library).
add_definitions(-DBOOST_ALL_DYN_LINK)
endif()
set(Boost_ADDITIONAL_VERSIONS "1.42" "1.42.0" "1.44" "1.44.0" "1.45.0" "1.45" "1.46" "1.46.1" "1.47.0" "1.47" "1.48" "1.50" "1.52" "1.53" "1.55" "1.56")
if(WIN32)
# for some unknown reason no one variant works on all windows platforms
set(Boost_DEBUG 1)
find_package( Boost COMPONENTS serialization graph regex filesystem system thread chrono date_time program_options system REQUIRED)
else()
find_package( Boost COMPONENTS serialization graph regex filesystem system thread date_time program_options system REQUIRED)
endif()
if(Boost_FOUND)
link_directories(${BOOST_LIBRARY_DIRS})
include_directories(${Boost_INCLUDE_DIRS})
add_definitions(${Boost_LIB_DIAGNOSTIC_DEFINITIONS})
endif()
find_package(CXSparse REQUIRED)
find_package(ANN)
if (ANN_FOUND)
set(ANN_LIBRARIES_SHARED ${ANN_LIBRARIES})
set(ANN_LIBRARIES_STATIC ${ANN_LIBRARIES})
else()
add_subdirectory("3rdparty/ann")
set(ANN_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/3rdparty/ann/ann_1.1.1_modified/include")
set(ANN_LIBRARIES_SHARED ann_shared)
set(ANN_LIBRARIES_STATIC ann_static)
endif()
find_package(Newmat)
if(NEWMAT_FOUND)
set(NEWMAT_LIBRARIES_SHARED ${NEWMAT_LIBRARIES})
set(NEWMAT_LIBRARIES_STATIC ${NEWMAT_LIBRARIES})
else()
add_subdirectory("3rdparty/newmat")
set(NEWMAT_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/3rdparty/newmat/newmat-10")
set(NEWMAT_LIBRARIES_SHARED newmat_shared)
set(NEWMAT_LIBRARIES_STATIC newmat_static)
endif()
if(APPLE)
find_package(OpenCV REQUIRED HINTS "/usr/local/opt/opencv3/share/OpenCV/")
else()
if(WIN32)
set(OpenCV_STATIC ON)
endif()
endif()
if(EXISTS "${OpenCV_DIR}/OpenCVConfig.cmake")
include("${OpenCV_DIR}/OpenCVConfig.cmake")
set(ADDITIONAL_OPENCV_FLAGS
"-DCV_MINOR_VERSION=${OpenCV_VERSION_MINOR} -DCV_MAJOR_VERSION=${OpenCV_VERSION_MAJOR}"
CACHE STRING "OpenCV Version Defines)"
)
## Include the standard CMake script
else()
set(ADDITIONAL_OPENCV_FLAGS
""
CACHE STRING "OpenCV Version Defines (BLUB)"
)
endif()
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ADDITIONAL_OPENCV_FLAGS}")
#################################################
# Declare Options and modify build accordingly ##
#################################################
# cvblob is needed for thermo
find_package(OpenCV QUIET)
if (OpenCV_FOUND)
include_directories(${OpenCV_INCLUDE_DIRS})
add_subdirectory(3rdparty/cvblob)
link_directories(${PROJECT_SOURCE_DIR}/3rdparty/cvblob)
else()
message(STATUS "Not building cvblob because WITH_OPENCV is OFF")
endif()
option(WITH_CGAL "Compile with CGAL support" ON)
option(WITH_LIBZIP "Compile with libzip support" ON)
option(WITH_OPENGL "Compile with OpenGL support" ON)
option(WITH_OPENCV "Compile with OpenCV support" ON)
option(WITH_QT "Compile tools relying on QT (qtshow)" ON)
option(WITH_GLFW "Compile with GLFW support" ON)
option(WITH_FTGL "Compile with FTGL support" ON)
option(WITH_XMLRPC "Compile with XMLRPC support" ON)
option(WITH_EIGEN3 "Compile with eigen3 support" ON)
option(WITH_LIBCONFIG "Compile with libconfig support" ON)
option(WITH_ROS "Compile with ROS support" OFF)
option(WITH_PYTHON "Compile Python bindings" ON)
option(WITH_WXWIDGETS "Compile with wxwidgets support" ON)
option(WITH_OPENCV_NONFREE "Whether to use non-free (patent encumbered) OpenCV functionalities" OFF)
option(WITH_COMPACT_OCTREE "Whether to use the compact octree display ON/OFF" OFF)
option(WITH_GLEE "Whether to use OpenGL extensions, requires glee. ON/OFF" OFF)
option(WITH_LASLIB "Whether to build LASlib based scanio library" ON)
## CUDA accelerated collision detection
option(WITH_CUDA "Whether to build CUDA accelerated collision detection tools" OFF)
if(WITH_CUDA)
find_package(CUDA REQUIRED)
include_directories(${FOUND_CUDA_NVCC_INCLUDE})
#owerrite users input - need to be fixed
#select all NVIDIA GPU arch which support unified memory (CUDA toolkit >= 6.0) and arch>=30
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-gencode arch=compute_30,code=sm_30;-gencode arch=compute_35,code=sm_35;-gencode arch=compute_50,code=sm_50;-gencode arch=compute_52,code=sm_52)
message("CUDA_NVCC_FLAGS = ${CUDA_NVCC_FLAGS}")
message(STATUS "With CUDA accelerated collision detection")
else()
message(STATUS "Without CUDA accelerated collision detection")
endif()
## RivLib
option(WITH_RIVLIB "Whether the RIEGL rivlib is present ON/OFF" OFF)
if(WITH_RIVLIB)
message(STATUS "Compiling a scan IO for RXP files")
set(RIEGL_DIR ${PROJECT_SOURCE_DIR}/3rdparty/riegl/)
if(UNIX)
set(RiVLib_USE_STATIC_RUNTIME ON)
endif()
find_package(RiVLib QUIET COMPONENTS scanlib HINTS "${RIEGL_DIR}/cmake/")
if(${RiVLib_FOUND})
include_directories(${RiVLib_INCLUDE_DIRS})
else()
# TODO: Remove this if nobody is using the old RiVLib anymore.
# Change QUIET to REQUIRED in the find_package call for RiVLib above.
message(STATUS "Cannot find current RiVLib. Trying to build scan IO for RXP files with old scanlib.")
add_definitions(-DWITH_OLD_RIVLIB)
find_package(LibXml2 REQUIRED)
include_directories(${LIBXML2_INCLUDE_DIR})
include_directories(${PROJECT_SOURCE_DIR}/3rdparty)
if(WIN32)
set(RiVLib_SCANLIB_LIBRARY ${RIEGL_DIR}libscanlib-mt.lib ${RIEGL_DIR}libctrllib-mt.lib ${RIEGL_DIR}libboost_system-mt-1_43_0-vns.lib ${LIBXML2_LIBRARIES})
else()
set(RiVLib_SCANLIB_LIBRARY ${RIEGL_DIR}libscanlib-mt-s.a ${RIEGL_DIR}libctrllib-mt-s.a ${RIEGL_DIR}libboost_system-mt-s-1_43_0-vns.a pthread ${LIBXML2_LIBRARIES})
endif()
endif()
else()
message(STATUS "Do NOT compile a scan IO for RXP")
endif()
option(WITH_OPENMP "Whether to use parallel processing capabilities of OPENMP. ON/OFF" ON)
if (WITH_OPENMP)
find_package(OpenMP REQUIRED)
endif()
option(WITH_METRICS "Whether to use time metrics. ON/OFF" OFF)
option(WITH_ADDONS "Whether to download and use addons to 3DTK. ON/OFF" OFF)
if(WITH_ADDONS)
message(STATUS "Compiling addons directory")
#execute_process(COMMAND svn co https://robotik.informatik.uni-wuerzburg.de/slam6dprivate/trunk/addons addons
# WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
# OUTPUT_QUIET
# )
message(STATUS "With addons.")
else()
message(STATUS "Without addons.")
endif()
#################################################
# OPERATING SYSTEM SPECIFIC BEHAVIOUR ##
#################################################
## Special treatment for system specifics
if(APPLE)
add_definitions(-Dfopen64=fopen)
endif()
## Multiple Cores
include(ProcessorCount)
ProcessorCount(PROCESSOR_COUNT)
if(NOT PROCESSOR_COUNT EQUAL 0)
set(NUMBER_OF_CPUS "${PROCESSOR_COUNT}" CACHE STRING "The number of processors to use (default: ${PROCESSOR_COUNT})" )
else()
set(NUMBER_OF_CPUS "1" CACHE STRING "The number of processors to use (default: 1)" )
endif()
# OPENMP_NUM_THREADS
if(OPENMP_FOUND AND WITH_OPENMP)
message(STATUS "With OpenMP ")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMAX_OPENMP_NUM_THREADS=${NUMBER_OF_CPUS} -DOPENMP_NUM_THREADS=${NUMBER_OF_CPUS} ${OpenMP_CXX_FLAGS} -DOPENMP")
else()
message(STATUS "Without OpenMP")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMAX_OPENMP_NUM_THREADS=1 -DOPENMP_NUM_THREADS=1")
endif()
# 3rdparty
if(WIN32)
include_directories(${PROJECT_SOURCE_DIR}/3rdparty/windows/)
link_directories(${PROJECT_SOURCE_DIR}/3rdparty/windows)
link_directories(${BOOST_LIBRARYDIR})
add_library(XGetopt STATIC ${PROJECT_SOURCE_DIR}/3rdparty/windows/XGetopt.cpp)
set(CMAKE_STATIC_LIBRARY_SUFFIX "32.lib")
# to be able to use numeric_limits<int>::max() and friends on windows
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOMINMAX")
else()
if (WITH_OPENGL)
# Add include path for OpenGL without GL/-prefix
# to avoid the include incompatibility between MACOS
# and linux
find_path(OPENGL_INC NAMES gl.h GL/gl.h PATHS /usr/include/GL)
if (${OPENGL_INC})
include_directories(${OPENGL_INC})
else()
message(STATUS "gl.h not found")
endif()
endif()
endif()
if (${CMAKE_CXX_COMPILER_ID} STREQUAL Clang)
# using Clang
set(ADDITIONAL_CFLAGS "-O3 -std=c++0x -msse3 -Wall -Wno-write-strings -Wno-char-subscripts -Wno-unused-result" CACHE STRING "Additional flags given to the compiler (-O3 -Wall -Wno-write-strings)" )
elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL GNU)
# using GCC
set(ADDITIONAL_CFLAGS "-O3 -std=c++0x -msse3 -Wall -finline-functions -Wno-unused-but-set-variable -Wno-write-strings -Wno-char-subscripts -Wno-unused-result" CACHE STRING "Additional flags given to the compiler (-O3 -Wall -finline-functions -Wno-write-strings)" )
elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL Intel)
# using Intel C++
elseif (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
# using Visual Studio C++
set(ADDITIONAL_CFLAGS "-O2" CACHE STRING "Additional flags given to the compiler ( -O2)" )
endif()
# Add OpenGL includes for MACOS if needed
# The OSX OpenGL frameworks natively supports freeglut extensions
if(APPLE)
include_directories(/System/Library/Frameworks/GLUT.framework/Headers)
include_directories(/System/Library/Frameworks/OpenGL.framework/Headers)
endif()
# hack to "circumvent" Debug and Release folders that are created under visual studio
# this is why the INSTALL target has to be used in visual studio
if(MSVC)
install(DIRECTORY ${PROJECT_SOURCE_DIR}/bin/Release/ CONFIGURATIONS Release DESTINATION ${PROJECT_SOURCE_DIR}/windows FILES_MATCHING PATTERN "*.dll" PATTERN "*.exe")
if( CMAKE_SIZEOF_VOID_P EQUAL 8 )
install(DIRECTORY ${PROJECT_SOURCE_DIR}/3rdparty/windows/x64/ CONFIGURATIONS Release DESTINATION ${PROJECT_SOURCE_DIR}/windows FILES_MATCHING PATTERN "*.dll" PATTERN "*.exe")
else()
install(DIRECTORY ${PROJECT_SOURCE_DIR}/3rdparty/windows/ CONFIGURATIONS Release DESTINATION ${PROJECT_SOURCE_DIR}/windows FILES_MATCHING PATTERN "*.dll" PATTERN "*.exe")
endif()
install(DIRECTORY ${PROJECT_SOURCE_DIR}/bin/Debug/ CONFIGURATIONS Debug DESTINATION ${PROJECT_SOURCE_DIR}/windows FILES_MATCHING PATTERN "*.dll" PATTERN "*.exe")
if( CMAKE_SIZEOF_VOID_P EQUAL 8 )
install(DIRECTORY ${PROJECT_SOURCE_DIR}/3rdparty/windows/x64/ CONFIGURATIONS Debug DESTINATION ${PROJECT_SOURCE_DIR}/windows FILES_MATCHING PATTERN "*.dll" PATTERN "*.exe")
else()
install(DIRECTORY ${PROJECT_SOURCE_DIR}/3rdparty/windows/ CONFIGURATIONS Debug DESTINATION ${PROJECT_SOURCE_DIR}/windows FILES_MATCHING PATTERN "*.dll" PATTERN "*.exe")
endif()
endif()
#################################################
# Robot Operating System (ROS) Integration ##
#################################################
if( catkin_FOUND )
catkin_package(
INCLUDE_DIRS include addons/include
)
endif()
#################################################
# GENERAL PROJECT SETTINGS ##
#################################################
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ADDITIONAL_CFLAGS}")
if(APPLE)
set(CMAKE_MACOSX_RPATH 1)
endif()
# Set include and link dirs ...
include_directories(${PROJECT_SOURCE_DIR}/include)
#include_directories(${PROJECT_SOURCE_DIR}/3rdparty/wxthings/include/)
link_directories(${PROJECT_SOURCE_DIR}/obj)
link_directories(${PROJECT_SOURCE_DIR}/lib)
# src/show must be added first because it defines the cache variables
# SHOW_LIBS_* which are used by others
add_subdirectory(src/show)
add_subdirectory(src/slam6d)
add_subdirectory(src/scanio)
add_subdirectory(src/scanserver)
add_subdirectory(src/segmentation)
add_subdirectory(src/normals)
add_subdirectory(src/veloslam)
add_subdirectory(src/qtshow)
add_subdirectory(src/grid)
add_subdirectory(src/pmd)
add_subdirectory(src/shapes)
add_subdirectory(src/floorplan)
add_subdirectory(src/thermo)
add_subdirectory(src/slam6d/fbr)
add_subdirectory(src/scanner)
add_subdirectory(src/model)
add_subdirectory(src/collision)
add_subdirectory(src/peopleremover)
add_subdirectory(src/spherical_quadtree)
add_subdirectory(src/cuda)
add_subdirectory(src/ros)
add_subdirectory(src/tools)
add_subdirectory(src/gps)
add_subdirectory(src/curvefusion)
# 3rdparty must come before src/calibration because it sets
# APRILTAG_INCLUDE_DIRS
add_subdirectory(3rdparty)
add_subdirectory(src/calibration)
add_subdirectory(bindings)
if(WITH_ADDONS)
message(STATUS "With 3dtk addons.")
add_subdirectory(addons)
endif()
find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)
enable_testing()
add_subdirectory(testing)
# Dummy target with all header files
# This is a hint for some IDEs, such as Qt Creator, to show all headers in the project tree
file(GLOB_RECURSE 3DTK_HEADER_FILES "include/*.h")
add_custom_target(headers SOURCES ${3DTK_HEADER_FILES})
message (STATUS "Build environment is set up!")
最佳答案 我的项目是用CMake构建的,我最后通过在CMakeFiles.txt中添加-g来解决这个问题
原来有一个
set(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS} ${ADDITIONAL_CFLAGS}”)
这将构建项目,无需额外的调试信息,将其更改为
set(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS} ${ADDITIONAL_CFLAGS} -g”)
在构建期间提供额外信息将允许调试(构建过程将比默认慢得多).