【问题标题】:Breakpoints not hit while debugging c++ in Visual Studio Code在 Visual Studio Code 中调试 c++ 时未命中断点
【发布时间】: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


【解决方案1】:

在编译 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)

我还从链接阶段删除了-g。开关需要在编译阶段(而不是链接阶段,由debug 目标执行)给出,因为它负责将调试信息写入程序。这只能从源代码生成,没有它,您的调试器将无法执行断点。


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2014-05-08
    • 2019-07-17
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多