vscode調試container中的程序的方法步驟
在寫cmu14-445的project時,我希望在本地vscode編輯代碼,然后在docker中編譯和測試代碼。但是如果測試出了問題,直接在本地調試就變得麻煩了。所以希望利用vscode進行遠程調試。
參考官方文檔,利用ssh + pipeTransport來完成,下面是我的launch.json和tasks.json最后的樣子。
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "g++-9 - Build and debug active file",
"type": "cppdbg",
"request": "launch",
"program": "./build/test/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"sourceFileMap":{
"/bustub": "${workspaceFolder}"
/*remote src directory : local src directory*/
/*文檔里說這個是為了便于debugger找源碼*/
},
"cwd": "/bustub",
"environment": [],
"pipeTransport": {
"pipeCwd": "/usr/bin",
"pipeProgram": "ssh",
"pipeArgs": [
"root@172.17.0.2"
],
"debuggerPath": "/usr/bin/gdb"
},
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++-9 build active file",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
{
"tasks": [
{
"type": "shell",
"label": "C/C++: g++-9 build active file",
"command": "ssh",
"args": [
"root@172.17.0.2",
"cd /bustub/build && make ${fileBasenameNoExtension}"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
編譯時利用ssh,在docker的終端中進行編譯。而在launch.json中利用ssh作為pipeProgram,傳遞調試信息(雖然原理我也不太懂就是了)。172.17.0.2是container的IP地址。
為了保證主機能夠直接通過ssh登錄container,需要修改一下dockerfile文件。最終我的dockerfile文件長這樣:
FROM ubuntu:18.04
# Install Ubuntu packages.
# Please add packages in alphabetical order.
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get -y update && \
apt-get -y install \
build-essential \
clang-8 \
clang-format-8 \
clang-tidy-8 \
cmake \
doxygen \
git \
g++-7 \
pkg-config \
valgrind \
zlib1g-dev \
ssh
RUN echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config && \
echo 'PermitEmptyPasswords yes' >> /etc/ssh/sshd_config && \
echo 'PasswordAuthentication yes' >> /etc/ssh/sshd_config && \
echo 'PubkeyAuthentication yes' >> /etc/ssh/sshd_config && \
mkdir /root/.ssh
COPY ./id_rsa.pub /root/.ssh/authorized_keys
CMD service ssh start && git config --global http.proxy "http://192.168.31.1:7890" && bash
修改的地方主要是安裝ssh,然后把本地公鑰copy過去,注意copy命令只能copy當前context下的文件,所以需要先復制一份公鑰到源碼目錄中。然后CMD中顯式啟動ssh service。并且配置git代理(不然有時候clone github會失?。?/p>
docker啟動該鏡像的時候就不要顯式指定命令了,不然這樣會覆蓋默認的CMD指令。
最后還需要改一下.dockerignore文件,原來的.dockerignore文件會忽略源碼目錄下所有文件,導致COPY命令出錯。OK,這樣就可以愉快地在本地vscode下面調試container里面的程序了。
update:
發(fā)現(xiàn)上面的遠程調試的方法挺麻煩的,vscode的docker插件提供了直接把vscode attach到container里的方法,然后直接在vscode里面調試就行了。這個方法唯一的弊端是每次開啟容器后,都需要在容器中重新安裝一次vscode的插件。
在bustub容器里裝了一波C++的插件,因為bustub的根目錄中已經有一個CmakeLists.txt,自動就配置好啦!

可以在vscode最下方的狀態(tài)欄中選擇cmake的build參數(shù),比如我希望運行buffer_pool_manager_instance_test,選擇相應的build對象,然后點擊圖上的小蟲就可以斷點調試了。
另外,之前用lldb調試的時候有如下報錯
error: 'A' packet returned an error: 8
需要在運行容器時加上--security-opt seccomp=unconfined 參數(shù),允許容器內的程序執(zhí)行全部系統(tǒng)調用。
到此這篇關于vscode調試container中的程序的方法步驟的文章就介紹到這了,更多相關vscode調試container內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Websocket直播間聊天室教程 GoEasy快速實現(xiàn)聊天室
這篇文章主要介紹了Websocket直播間聊天室教程 GoEasy快速實現(xiàn)聊天室,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05

