目录:
- 使用vscode调试大型程序
- 使用命令行调试大型程序
注意:本文主要针对c/c++程序的调试。
使用vscode调试
主要是配置launch.json和task.json文件进行调试。
- 先配置合适的task.json文件,即具体需要执行或调试的命令。
- 配置launch.json,即配置启动文件。
- 注意在调试时需要在makefile文件中配置好debug(方法参考2.使用命令行调试大型程序部分),否则无法标记断点。
- 预先在需要处标记断点,并按F5开始调试。
task.json
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "clean", // 任务名称
"command": "make", // 命令
"args": ["clean"], // 相当于make clean
"type": "shell"
},
{
"label": "build-debug",
"command": "make",
"args": ["debug"],
"type": "shell"
},
{ // 依次调试多个任务,若不配置此,则每次launch只会启动一个任务。
"label": "build-all",
"dependsOn": [
"clean",
"build-debug"
]
}
]
}
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": "makefile debug", // launch名称
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/monitor", // 调试的程序位置,是你实际makefile生成的程序
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}", // 当前项目的路径,即用vscode打开文件夹时的位置,需要注意。
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "build-all", // 第一次开始调试的任务,见task.json
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
json中其它未注明的选项描述,详见官方文档(见.json中链接)。
运行成功:
使用命令行调试
- 首先配置cmake或makefile文件,参考:
makefile totorials
cmake tutorials
vscode+cmake+gdb构建大型工程项目
- 示例CMakeLists.txt如下:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) # cmake最低版本要求
PROJECT(CppTemplate) # 工程名 CppTemplate
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") # 添加c++11标准支持
SET(CMAKE_C_COMPILER "/usr/bin/gcc") # 默认c编译器
SET(CMAKE_CXX_COMPILER "/usr/bin/g++") # 默认c++编译器
SET(CMAKE_BUILD_TYPE "Debug") # Debug模式 选项: Release Debug MinSizeRel RelWithDebInfo
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb") # debug模式下 gdb相关选项
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall") # release模式下 gdb相关选项
# set(CMAKE_VERBOSE_MAKEFILE ON) # 开启调试 出现问题时开启
# enable_testing() # 打开测试
add_definitions(-DDEBUG) # 相当于代码中 #define DEBUG
# add_subdirectory(test) # 添加test子目录
SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/bin") # 可执行文件输出目录
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/include") # 头文件包含目录
# 这段代码可以区分操作系统
MESSAGE("Identifying the OS...")
if(WIN32)
MESSAGE("This is Windows.")
elseif(APPLE)
MESSAGE("This is MacOS.")
elseif(UNIX)
MESSAGE("This is Linux.")
endif()
# 这段代码可以区分操作系统
AUX_SOURCE_DIRECTORY(src DIR_SRCS) # 添加源代码文件夹, 自动扫描所有文件
add_executable(chess # 输出名为chess的可执行文件
${DIR_SRCS}
)
# 也可以这么写
# add_executable(chess # 输出名为chess的可执行文件
# ./src/main.cpp
# ./src/utils.cpp
# )
- 示例Makefile如下:
其中-g
表示生成可调试文件。
objects = main.o read_data.o fft.o complex.o
eq_match: $(objects)
g++ -o debug $(objects)
main.o: main.cpp read_data.h complex.h
g++ -g -c main.cpp
read_data.o: read_data.cpp
g++ -g -c read_data.cpp
fft.o: fft.cpp complex.h
g++ -g -c fft.cpp
complex.o: complex.cpp
g++ -g -c complex.cpp
clean:
rm eq_match $(objects)
- 使用gdb调试编译生成的可调试程序。
注意:多个文件标记断点方法为目标文件+断点位置,如:
b main.cpp:1 # 即在main.cpp文件的第一行打断点, b为breakpoint命令。
最后祝大家成功!