/**
* @author siwen.li (lisiwen945@163.com)
* @brief 簡述vscode用gdb調(diào)試linux代碼
* @version 0.1
* @date 2021-03-02
*
* @copyright Copyright (c) 2021
*/
關(guān)于c/c++代碼編輯器
對(duì)于c/c++程序員來說趴拧,可能更多使用的環(huán)境是linux環(huán)境
在linux上編寫調(diào)試c/c++代碼比較麻煩
vim
在寫代碼這塊奶卓,大神vim玩到飛起晴音,
但是要記憶的快捷鍵太多肘交,像我這種手殘黨無法適應(yīng)
notepad++,source insight
初學(xué)時(shí)可能用的比較多的是notepad++唆缴,source insight等傳統(tǒng)的編輯器
notepad++只適合單文件編輯鳍征,
source insight對(duì)c++的特性支持不太好,
而且只是文本編輯器面徽,不能提示錯(cuò)誤艳丛,不能智能提示和補(bǔ)全代碼
vs 和 codeblocks
后來用了宇宙第一ide vs,確實(shí)很好用趟紊,能夠監(jiān)視進(jìn)程資源氮双,代碼編寫、編譯霎匈、調(diào)試 一氣呵成戴差,但是太過臃腫,動(dòng)則好幾十G铛嘱,堪稱巨無霸
codeblocks 配合Mingw在windows上寫代碼還是比較方便造挽,但是不能試用于linux環(huán)境
vscode
vscode用過之后極大的提升了效率,不僅界面好看弄痹,能夠自動(dòng)補(bǔ)全和智能提示錯(cuò)誤饭入,而且支持很多插件,如markdown darwio等肛真,而且還集成了git能夠查看diff文件谐丢,還能夠用remote ssh登錄服務(wù)器......
ssh remote
vscode 安裝remote插件
連接服務(wù)器,網(wǎng)上教程很多蚓让,不多贅述乾忱,連上后會(huì)左下角狀態(tài)如下
gdb調(diào)試
調(diào)試單個(gè)文件
點(diǎn)擊運(yùn)行 - 調(diào)試 默認(rèn)會(huì)生成兩個(gè)json文件在 .vscode下,
- gcc - 生成和調(diào)試活動(dòng)文件 launch.json (用于調(diào)試)
- C/C++: gcc 生成活動(dòng)文件 task.json (用于編譯)
小試牛刀調(diào)試個(gè)hello world历极,代碼左邊添加斷點(diǎn)
可以看出窄瘟,能夠非常方便的查看堆棧信息 可視化的看各個(gè)變量的值
多文件編譯調(diào)試
多文件編譯調(diào)試,可以打開tasks.json看看
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc 生成活動(dòng)文件",
"command": "/usr/bin/g++",
"args": [
"-I",
"/home/swing/code/apue.3e/include",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "調(diào)試器生成的任務(wù)趟卸。"
}
],
"version": "2.0.0"
}
可以看出task.json就是用g++生成了一個(gè)和文件同名的可執(zhí)行文件蹄葱,對(duì)于多文件不適用,多文件我更習(xí)慣于用Makefile或者cmake來生成
- 在終端上用gdb調(diào)試demuxer 進(jìn)程锄列,需要傳遞一個(gè)圖片參數(shù)
swing@ubun:~/code/ffmpeg$ make demuxer
g++ -g -Wall -o ./bin/demuxer -I ./include -L /home/swing/ffmpeg_src/output/lib ./src/demux.cpp ./src/Xdemux.cpp -lavcodec -lavdevice -lavfilter -lavformat -lavutil -lswresample -lswscale -lpthread
swing@ubun:~/code/ffmpeg/bin$ gdb --args ./demuxer jpeg_dog.jpeg
(gdb) r
Starting program: /home/swing/code/ffmpeg/bin/demuxer jpeg_dog.jpeg
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
open jpeg_dog.jpeg success!
totalMs = 40
Input #0, image2, from 'jpeg_dog.jpeg':
Duration: 00:00:00.04, start: 0.000000, bitrate: 24002 kb/s
Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown), 1298x793 [SAR 96:96 DAR 1298:793], 25 tbr, 25 tbn, 25 tbc
[Inferior 1 (process 70727) exited normally]
(gdb) Quit
(gdb) q
swing@ubun:~/code/ffmpeg/bin$
- 在vscode上調(diào)試編譯好的文件
打開launch.json
{
// 使用 IntelliSense 了解相關(guān)屬性图云。
// 懸停以查看現(xiàn)有屬性的描述。
// 欲了解更多信息邻邮,請(qǐng)?jiān)L問: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gcc - 生成和調(diào)試活動(dòng)文件",
"type": "cppdbg",
"request": "launch",
// "program": "${fileDirname}/${fileBasenameNoExtension}",
"program": "/home/swing/code/ffmpeg/bin/demuxer",
// "args": [],
"args": ["/home/swing/code/ffmpeg/bin/jpeg_dog.jpeg"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"console": "externalTerminal",
"MIMode": "gdb",
"setupCommands": [
{
"description": "為 gdb 啟用整齊打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
// 這個(gè)在調(diào)試前會(huì)調(diào)用編譯單個(gè)文件的task竣况,可以注釋掉
// "preLaunchTask": "C/C++: gcc 生成活動(dòng)文件",
"miDebuggerPath": "/usr/bin/gdb"
}
]
}
將program替換成你要調(diào)試的進(jìn)程,在agrs中添加你要傳遞的參數(shù)筒严,啟動(dòng)調(diào)試
- 可以看出在local中不僅可以查看局部變量丹泉,還可以查看在this指針中的全部成員變量情萤,非常方便
- 還可以顯示堆棧和斷點(diǎn)信息
- 在調(diào)試控制臺(tái) 中用-exec指令輸入 gdb中的命令可以實(shí)現(xiàn)和在終端中一樣的效果
總結(jié)
使用vscode remote 用gdb調(diào)試,可以可視化的查看代碼的運(yùn)行狀態(tài)摹恨,非常方便筋岛,極大的提升了效率