【发布时间】:2020-09-26 18:54:52
【问题描述】:
系统: POP 操作系统 IDE: Visual Studio 代码
我正在尝试调试一个简单的 c++ 项目。当我最初设置项目时,调试器将按预期运行。当我添加一个生成文件时,断点不再被命中。在添加 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)/*
如果我应该包含更多文件,请告诉我。
【问题讨论】:
-
“在最初设置项目和创建 makefile 之间的某个时刻,断点停止被击中。我认为这是由于我的 makefile 或配置,因为它以前工作。但是我被难住了。” 这就是为什么您应该使用版本控制,这样您就可以简单地回到过去,提醒自己您所做的更改。 30 年来,这一直是基本的标准做法?
-
我正在使用版本控制。我知道发生了什么变化:makefile。我只是不清楚为什么在使用 -g 编译时没有命中断点。
-
好的,所以你知道的比你告诉我们的要多!您不仅知道 生成文件已更改;你也知道它是如何变化的,所以这应该是你问题的重点......
-
谢谢。我编辑了更多细节。
-
这样更好 - 我们现在有足够的时间继续进行。
标签: c++ debugging visual-studio-code makefile breakpoints