一、VScode +gdb调试
(1)步骤总结

(2)配置 launch.json文件
需要修改的部分:
"name":配置文件名称,可修改也可不修改;
"program":程序可执行文件的完整路径,必须修改且要对应上;
"preLaunchTask":调试会话开始前需要执行的任务的名称,可修改也可不修改,若要修改必须与task.json中的任务名称"label"对应上,否则无法执行任务;
//launch.json文件内容
{
"version": "0.2.0",
"configurations": [
{
"name": "调试threadpool",//可修改也可不修改
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/threadpool",//修改,执行文件是threadpool
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
},
{
"name": "C/C++: g++ 构建和调试活动文件",//可修改也可不修改
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/threadpool",//修改,执行文件是threadpool
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ 生成活动文件",/若要修改必须与task.json中的任务名称"label"对应上,否则无法执行任务;
"miDebuggerPath": "/usr/bin/gdb"
},
{
"name": "C/C++: g++-9 构建和调试活动文件",//可修改也可不修改
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/threadpool",//修改,执行文件是threadpool
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++-9 生成活动文件",若要修改必须与task.json中的任务名称"label"对应上,否则无法执行任务;
"miDebuggerPath": "/usr/bin/gdb"
},
{
"name": "C/C++: gcc 构建和调试活动文件",//可修改也可不修改
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/threadpool",//修改,执行文件是threadpool
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: gcc 生成活动文件",若要修改必须与task.json中的任务名称"label"对应上,否则无法执行任务;
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
(3)配置task.josn文件
需要修改的部分:
"command":需要在调试之前执行的命令文件路径,需要修改为makefile路径,makefile要添加执行权限,且在终端中输入./makefile是可以执行makefile的。
"args":其他要传递给编译器或编译脚本的参数
//task.josn文件内容
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc 生成活动文件",
"command": "/home/lxl/mythreadpool_project/makefile",//需要修改为makefile路径
"args": [//修改参数
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
},
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/home/lxl/mythreadpool_project/makefile",
"args": [
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "调试器生成的任务。"
},
{
"type": "cppbuild",
"label": "C/C++: g++-9 生成活动文件",
"command": "/home/lxl/mythreadpool_project/makefile",
"args": [
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
//makefile 文件内容
gcc -std=c++17 -Wall -g -c main.cpp #先编译成依赖main.cpp文件生成main.o文件,需要加 -g才能进行调试
gcc -std=c++17 -Wall main.o -g -o threadpool -lpthread -lstdc++ #再用生存的main.o文件生成可执行文件threadpool,需要添加 -lpthread标准库,不然无法执行线程函数,需要添加-lstdc++标准库,因为用 gcc 连接 C++ 程序需要人为指定连接 C++ 标准库,否则就会出现undefined reference to `__gxx_personality_v/0' 之类的错误。
注意:
1、 先编译成依赖main.cpp文件生成main.o文件,需要加 -g才能进行调试;
2、再用生存的main.o文件生成可执行文件threadpool,需要加 -g才能进行调试;
3、需要添加 -lpthread标准库,不然无法执行线程函数,需要添加-lstdc++标准库,因为用 gcc 连接 C++ 程序需要人为指定连接 C++ 标准库,否则就会出现undefined reference to `__gxx_personality_v/0' 之类的错误。
4、下面这样的makefile文件内容会出现报错
#makefile
#编译器
CXX = g++
#编译选项
CXXFLAGS = -std=c++17 -Wall
#目标文件
TARGET = threadpool
#源文件
SRCS = main.cpp #threadpool.cpp
#目标文件
OBJS = $(SRCS:.cpp=.o)
#头文件
HEADERS = threadpool.h
#默认目标
all:$(TARGET)
#生成可执行文件
$(TARGET):$(OBJS)
-$(CXX) $(CXXFLAGS) -o $@ $^ -lpthread
-./$(TARGET)
#生成目标文件
%.o:%.cpp $(HEADERS)
-$(CXX) $(CXXFLAGS) -c $<
#清理生成文件
clean:
-rm -f $(OBJS) $(TARGET)
无法直接执行makefile文件

按照上述步骤进行操作之后就可以进行调试了

二、gdb调试
1、常用命令



2、远程调试
1、远程登陆zhangzong
2、将可执行文件进行传输

3、检查文件是否可执行

4、检查gdbserver 版本号


5、启动gdbserver
输入gdbserver ip地址:终端接口 可执行文件
(注意:终端接口不能与远程连接的虚拟机端口重复,且防护墙允许访问)

6、在lxl虚拟机上打开gdp,输入target remote 192.168.137.101:6666

7、在zhangzong虚拟机上监听到了

8、可以开始调试了,先试着运行程序,使用continue


9、添加断点
