c++ - 在 Visual Studio Code 中调试 c++ 时未命中断点
问题描述
系统: POP OS IDE: Visual Studio Code
我正在尝试调试一个简单的 c++ 项目。当我最初设置项目时,调试器将按预期运行。当我添加一个生成文件时,断点不再被命中。在添加 makefile 之前,我使用g++ -g -o main.o main.cpp从 task.json 文件编译。这个命令显然没有做makefile正在做的事情,但是在我的环境中调试DID工作。
将 launch.json 设置为 stopAtEntry 也不起作用。所以我的假设是我编译不正确。
生成文件输出:
g++ -Wall -I./header -L./lib -c -o 源/MqttManager.o 源/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
以下是相关文件:
启动.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)/*
让我知道是否应该包含更多文件。
解决方案
-g
您曾经在编译 CPP 文件时给 g++开关。现在你没有。它需要重新添加。
您编写 Makefile 的方式,您可以取消注释 的定义DEBUGFLAGS
,然后在您的目标中更改$(CXXFLAGS)
为。但是,这也会影响发布版本,因此您可能希望找到一种不同的方法来执行此操作,例如仅替换目标的定义(这也会影响其依赖项):$(DEBUGFLAGS)
$(SDIR)/%.o
CXXFLAGS
debug
debug: CXXFLAGS=$(DEBUGFLAGS)
debug: prep $(DEBUGDIR)/$(EXENAME) objclean
$(DEBUGDIR)/$(EXENAME): $(OBJ)
$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)
我也-g
从链接阶段删除了。开关需要在编译阶段(不是链接阶段,由debug
目标执行)给出,因为它负责将调试信息写入程序。这只能从源代码生成,没有它,您的调试器将无法执行断点。
tl;博士
在您引用的结果命令中,您需要将其-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
推荐阅读
- authentication - 如何从 Spotify 访问令牌中检索数据以及如何验证访问令牌
- r - 由强制错误和无效打印数字产生的 NA
- wordpress - 使用 Timber 为通用页面模板渲染自定义树枝文件
- javascript - 如何仅使用 webpack 5 编译一个打字稿文件并排除其他所有内容?
- ruby - 如何解决 macOS 上的 gem install pg 错误
- python - 将 HTML 转换为 CSV 或 XLS 以进行 SSIS 平面文件上传
- kubernetes - 在 Kubernetes 中使用 Helm GitLab-Runner 进行带有自签名证书的 Gitlab 和 Docker Registry(x509 错误)
- stream - 区分 RTCPeerConnection 远端的轨道种类
- sql - SQL 日期场景,用于在本月 1 日获取上个月的数据,然后在上个月下降
- database-design - 重复用户的数据库结构