簡體   English   中英

在 Visual Studio Code 中調試 C++ 時未命中斷點

[英]Breakpoints not hit while debugging c++ in Visual Studio Code

系統: POP OS IDE: Visual Studio Code

我正在嘗試調試一個簡單的 C++ 項目。 當我最初設置項目時,調試器會按預期運行。 當我添加一個 makefile 時,斷點不再被命中。 在添加 makefile 之前,我使用g++ -g -o main.o main.cpp從 task.json 文件編譯。 這個命令顯然沒有做 makefile 正在做的事情,但在我的環境中調試確實有效。

將 launch.json 設置為 stopAtEntry 也不起作用。 所以我的假設是我編譯不正確。

生成文件輸出:

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

以下是相關文件:

啟動文件

   {
    "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目標$(DEBUGFLAGS) $(CXXFLAGS)更改$(CXXFLAGS) $(DEBUGFLAGS) 但是,這也會影響發布版本,因此您可能希望找到一種不同的方法來執行此操作,例如替換僅用於debug目標的CXXFLAGS定義(這也會影響其依賴項):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM