在 Visual Studio 代码中调试 c++ 时未命中断点
Breakpoints not hit while debugging c++ in Visual Studio Code
系统:POPOS
IDE: Visual Studio代码
我正在尝试调试一个简单的 C++ 项目。当我最初设置项目时,调试器会按预期运行。当我添加一个 makefile 时,断点不再命中。在添加 makefile 之前,我使用 g++ -g -o main.o main.cpp 从 task.json 文件编译。这个命令显然没有做 makefile 正在做的事情,但在我的环境中调试 DID 工作。
将 launch.json 设置为 stopAtEntry 也不起作用。所以我的假设是我编译不正确。
Makefile 输出:
g++ -Wall -I./header -L./lib -c -o source/MqttManager.o source/MqttManager.cpp
g++ -g -o bin/debug/GenericMqttClient source/main.o source/MqttManager.o -Wall -I./header -L./lib -lpaho-mqtt3c
rm -r ./source/*.o
相关文件如下:
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/bin/debug/GenericMqttClient",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file",
"miDebuggerPath": "/bin/gdb"
}
]
}
生成文件
CXX = g++
EXENAME = GenericMqttClient
# Directories
HDIR = ./header
LDIR = ./lib
ODIR = ./obj
SDIR = ./source
BIN = ./bin
DEBUGDIR = $(BIN)/debug
RELDIR = $(BIN)/release
# Project Files
SRC = $(wildcard $(SDIR)/*.cpp)
OBJ = $(SRC:.cpp=.o)
# Includes
DEPS = $(HDIR)/MqttManager.h
LIBS = -lpaho-mqtt3c
#flags
CXXFLAGS = -Wall -I$(HDIR) -L$(LDIR)
# DEBUGFLAGS = $(CXXFLAGS) -g
# Object files
$(SDIR)/%.o: %.cpp $(DEPS)
$(CXX) -c -o $@ $< $(CXXFLAGS) $(LIBS)
# Release
release: prep $(RELDIR)/$(EXENAME) objclean
$(RELDIR)/$(EXENAME): $(OBJ)
$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)
# Debug
debug: prep $(DEBUGDIR)/$(EXENAME) objclean
$(DEBUGDIR)/$(EXENAME): $(OBJ)
$(CXX) -g -o $@ $^ $(CXXFLAGS) $(LIBS)
#
# Other Rules
#
all: clean debug release objclean
prep:
@mkdir -p $(DEBUGDIR) $(RELDIR)
objclean:
rm -r $(SDIR)/*.o
clean:
rm -rf $(BIN)/*
让我知道是否应该包含更多文件。
您曾经在编译 CPP 文件时给 g++ -g
开关。现在你不知道。它需要重新添加。
按照您编写 Makefile 的方式,您可以取消注释 DEBUGFLAGS
的定义,然后在 $(SDIR)/%.o
目标中将 $(CXXFLAGS)
更改为 $(DEBUGFLAGS)
。但是,这也会影响发布版本,因此您可能想找到一种不同的方法来执行此操作,例如仅针对 debug
目标替换 CXXFLAGS
定义(这也会影响其依赖项) :
debug: CXXFLAGS=$(DEBUGFLAGS)
debug: prep $(DEBUGDIR)/$(EXENAME) objclean
$(DEBUGDIR)/$(EXENAME): $(OBJ)
$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)
我还从 link 阶段删除了 -g
。 switch需要在编译阶段给出(notlink阶段,由debug
target执行)因为它负责写调试信息进入你的程序。这只能从源代码生成,没有它,您的调试器将无法处理断点。
tl;dr
在您引用的结果命令中,您需要将 -g
从第二个命令移动到第一个命令:
g++ -Wall -I./header -L./lib -c -o source/MqttManager.o source/MqttManager.cpp
g++ -g -o bin/debug/GenericMqttClient source/main.o source/MqttManager.o -Wall -I./header -L./lib -lpaho-mqtt3c
rm -r ./source/*.o
系统:POPOS IDE: Visual Studio代码
我正在尝试调试一个简单的 C++ 项目。当我最初设置项目时,调试器会按预期运行。当我添加一个 makefile 时,断点不再命中。在添加 makefile 之前,我使用 g++ -g -o main.o main.cpp 从 task.json 文件编译。这个命令显然没有做 makefile 正在做的事情,但在我的环境中调试 DID 工作。
将 launch.json 设置为 stopAtEntry 也不起作用。所以我的假设是我编译不正确。
Makefile 输出:
g++ -Wall -I./header -L./lib -c -o source/MqttManager.o source/MqttManager.cpp
g++ -g -o bin/debug/GenericMqttClient source/main.o source/MqttManager.o -Wall -I./header -L./lib -lpaho-mqtt3c
rm -r ./source/*.o
相关文件如下:
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "g++ - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/bin/debug/GenericMqttClient",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ build active file",
"miDebuggerPath": "/bin/gdb"
}
]
}
生成文件
CXX = g++
EXENAME = GenericMqttClient
# Directories
HDIR = ./header
LDIR = ./lib
ODIR = ./obj
SDIR = ./source
BIN = ./bin
DEBUGDIR = $(BIN)/debug
RELDIR = $(BIN)/release
# Project Files
SRC = $(wildcard $(SDIR)/*.cpp)
OBJ = $(SRC:.cpp=.o)
# Includes
DEPS = $(HDIR)/MqttManager.h
LIBS = -lpaho-mqtt3c
#flags
CXXFLAGS = -Wall -I$(HDIR) -L$(LDIR)
# DEBUGFLAGS = $(CXXFLAGS) -g
# Object files
$(SDIR)/%.o: %.cpp $(DEPS)
$(CXX) -c -o $@ $< $(CXXFLAGS) $(LIBS)
# Release
release: prep $(RELDIR)/$(EXENAME) objclean
$(RELDIR)/$(EXENAME): $(OBJ)
$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)
# Debug
debug: prep $(DEBUGDIR)/$(EXENAME) objclean
$(DEBUGDIR)/$(EXENAME): $(OBJ)
$(CXX) -g -o $@ $^ $(CXXFLAGS) $(LIBS)
#
# Other Rules
#
all: clean debug release objclean
prep:
@mkdir -p $(DEBUGDIR) $(RELDIR)
objclean:
rm -r $(SDIR)/*.o
clean:
rm -rf $(BIN)/*
让我知道是否应该包含更多文件。
您曾经在编译 CPP 文件时给 g++ -g
开关。现在你不知道。它需要重新添加。
按照您编写 Makefile 的方式,您可以取消注释 DEBUGFLAGS
的定义,然后在 $(SDIR)/%.o
目标中将 $(CXXFLAGS)
更改为 $(DEBUGFLAGS)
。但是,这也会影响发布版本,因此您可能想找到一种不同的方法来执行此操作,例如仅针对 debug
目标替换 CXXFLAGS
定义(这也会影响其依赖项) :
debug: CXXFLAGS=$(DEBUGFLAGS)
debug: prep $(DEBUGDIR)/$(EXENAME) objclean
$(DEBUGDIR)/$(EXENAME): $(OBJ)
$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)
我还从 link 阶段删除了 -g
。 switch需要在编译阶段给出(notlink阶段,由debug
target执行)因为它负责写调试信息进入你的程序。这只能从源代码生成,没有它,您的调试器将无法处理断点。
tl;dr
在您引用的结果命令中,您需要将 -g
从第二个命令移动到第一个命令:
g++ -Wall -I./header -L./lib -c -o source/MqttManager.o source/MqttManager.cpp
g++ -g -o bin/debug/GenericMqttClient source/main.o source/MqttManager.o -Wall -I./header -L./lib -lpaho-mqtt3c
rm -r ./source/*.o