文章目录
- 一、vscode 远程连接
- 二、vscode attach 调试
- 1.vscode 调试
一、vscode 远程连接
(1)下载远程插件
(2)在远程端生成秘钥
#!bin/bash
if [ $# -lt 1 ]; then
echo "usage: $0 hostname@ip"
exit
fi
ssh-keygen
ssh-copy-id $1
cp ~/.ssh/id_rsa ./
echo "/***************************************************/\nid_rsa is in ./ now,copy it to C:\Users\testwin10/.ssh/\n/***************************************************/"
把上述代码保存为shell文件,假设名字为buildKey.sh
再执行脚本sh buildKey.sh ip@userName
ip就是远程IP地址,后面可接用户名比如root
接着就输入密码,一路回车完事,生成的秘钥id_rsa就会在当前目录下,把他复制当window主机的ssh目录下
我的电脑是这个目录:C:\Users\testwin10/.ssh/
(3)设置vscode 的ssh配置
选第一个
配置参考如下:
Host CentOs7
HostName 192.XXX.XXX.XXX
User root
IdentityFile C:\Users\testwin10/.ssh/id_rsa //这里就是之前在linux虚拟机生成的秘钥文件
点击按钮远程连接,出现左下角的图标代表连接成功,下面就可以远程调试代码了。如果出现id_rsa权限威胁的错误,执行指令chmod 600 id_rsa
二、vscode attach 调试
1.vscode 调试
vscode 调试有两种lauch 和 attach,lauch需要把执行文件跑起来再调试,然而项目文件不可能每个文件编译后再调试,此时就需要用到attach,也就是附加到进程调试。
(1)在打开的远程目录下按下F5
如果提示安装插件的话,就先按插件
有插件的话会出现以下界面
下面打开lauch.json
lauch.json配置如下(示例):
"configurations": [
{
"name": "(gdb) 附加",
"type": "cppdbg",
"request": "attach",
"processId":"${command:pickProcess}",
"program": "xxx/a.out",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"sourceFileMap":{
"/AAA/": "/BBB/"
},
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
关键字的解释
“processId”:"${command:pickProcess}"选择这个默认值可以有一个弹窗让你选择进程,按我说的配置完毕后,按下F5,就会有如下图的弹窗出现,可以直接在输入框键入进程名,按下回车就可以开始调试了
“program” 是调试的远程执行文件的绝对路径
“sourceFileMap”,重点
开始我没设置这个关键字时按下F5调试时会出以下的问题:
读取文件失败,无法打开/AAA/c.cpp
但我的c.cpp文件是在/BBB/目录下的
(如果调试过程中并没有报错这可以忽视掉这个关键字)
这个时候就需要这个关键字作为映射了:
"sourceFileMap":{
"/AAA/": "/BBB/"
},
另外,如果出现其他问题可以看看调试控制台的日志,这里的日志和直接用gdb指令调试是一模一样的。在这个窗口的最下面,使用-exec后可以直接根gdb指令比如-exec info registers
问题补充:
lauch.json配置 中 "sourceFileMap"可以替换源码路径,但是也会制造一点麻烦:它将使用完全限定的断点和文件路径。如果你项目有多个目录代码,你只想编译其中一个目录,编译后重新调试,你会发现这个重编的目录里面代码无法设置断点了。断点变成灰色:Module containing this breakpoint has not yet loaded or the breakpoint adress could not be obtained.
解决方法:
"sourceFileMap":{
"/AAA/": "/BBB/"
},
改成
"sourceFileMap":{
"/AAA/":{
"editorPath" :"/BBB/",
"useForBreakpoints" : false
}
},