簡單介紹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: "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會失敗)。
docker啟動該映象的時候就不要顯式指定 了,不然這樣會覆蓋預設的CMD指令。
最後還需要改一下.dockerignore檔案,原來的.dockerignore檔案會忽略原始碼目錄下所有檔案,導致COPY命令出錯。OK,這樣就可以愉快地在本地vscode下面除錯container裡面的程式了。
發現上面的遠端除錯的方法挺麻煩的,vscode的docker外掛提供了直接把vscode attach到container裡的方法,然後直接在vscode裡面除錯就行了。這個方法唯一的弊端是每次開啟容器後,都需要在容器中重新安裝一次vscode的外掛。
在bustub容器裡裝了一波C++的外掛,因為bustub的根目錄中已經有一個CmakeLists.txt,自動就配置好啦!
可以在vscode最下方的狀態列中選擇cmake的build引數,比如我希望執行buffer_pool_manager_instance_test,選擇相應的build物件,然後點選圖上的小蟲就可以斷點除錯了。
另外,之前用lldb除錯的時候有如下報錯
error: 'A' packet returned an error: 8
需要在執行容器時加上--security-opt seccomp=unconfined 引數,允許容器內的程式執行全部系統呼叫。
到此這篇關於vscode除錯container中的程式的方法步驟的文章就介紹到這了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2886443/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何除錯javascript程式碼簡單介紹除錯JavaScript
- 簡單介紹Git合併分支的流程步驟Git
- 簡單介紹java中的equals()方法Java
- 徹底刪除MySQL步驟介紹ATSSMySql
- 簡單介紹Golang切片刪除指定元素的三種方法Golang
- 簡單介紹CentOS6升級glibc操作步驟CentOS
- 求救:關於EJB單步除錯的方法除錯
- 簡單介紹Rust中的workspaceRust
- AptanaStudio3+PHP程式遠端除錯的方法和步驟APTASTPHP除錯
- Fedora中安裝 Shutter步驟介紹
- 簡單介紹PostgreSQL解析URL的方法SQL
- 簡單介紹oracle重置序列的方法Oracle
- 簡單介紹NMS的實現方法
- 簡單介紹Lua中的變數與賦值方法變數賦值
- TensorFlow除錯程式介紹除錯
- VC++程式設計環境下的除錯步驟C++程式設計除錯
- BAPI的簡單實現步驟API
- hanlp新增自定義字典的步驟介紹HanLP
- Webpack 的簡單介紹Web
- Promise的簡單介紹Promise
- CFRunloopObserverRef 的簡單介紹OOPServer
- javascript中的閉包概念簡單介紹JavaScript
- SAP 電商雲 Spartacus 伺服器端渲染的單步除錯詳細步驟伺服器除錯
- 微信小程式開發系列 (二) :微信小程式的單步除錯和控制器實現步驟概述微信小程式除錯
- 華為AC基本除錯步驟除錯
- 使用谷歌瀏覽器進行斷點除錯簡單介紹谷歌瀏覽器斷點除錯
- javascript的靜態方法和例項方法簡單介紹JavaScript
- javascript delete刪除屬性的注意點簡單介紹JavaScriptdelete
- 簡單介紹SQL中ISNULL函式使用方法SQLNull函式
- javascript方法過載簡單介紹JavaScript
- js 特權方法簡單介紹JS
- 如何在vscode中除錯程式碼?VSCode除錯
- BAPI的簡單實現步驟(轉)API
- SAP UI5 BaseObject.extend 方法的單步除錯UIObject除錯
- javascript中的就加號+的用法簡單介紹JavaScript
- Kdevelop的簡單使用和簡單除錯dev除錯
- 安卓開發中RecycleView簡單使用步驟安卓View
- javascript的正規表示式的test()方法簡單介紹JavaScript