Vscode 附加进程调试

  • Post author:
  • Post category:其他





一、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虚拟机生成的秘钥文件

在这里插入图片描述

点击按钮远程连接,出现左下角的图标代表连接成功,下面就可以远程调试代码了。



二、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
                }
            },

方法提供:https://github.com/microsoft/vscode-cpptools/issues/6658



版权声明:本文为Supreme_Julyan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。