精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

內存問題克星:VSCode GDB調試全攻略

開發(fā) 前端
VSCode,作為一款廣受歡迎的輕量級代碼編輯器,憑借其簡潔的界面、強大的插件系統(tǒng)以及跨平臺的特性,贏得了眾多開發(fā)者的心。而 GDB(GNU Debugger),則是 Linux 環(huán)境下非常強大的調試工具,它提供了豐富的命令和功能,讓我們能夠靈活地控制程序的運行,檢查變量的值,查看內存狀態(tài)等等。

各位開發(fā)者伙伴,在 C/C++ 的開發(fā)世界里,精準調試是解決代碼問題、提升開發(fā)效率的關鍵。今天,我們聚焦 VSCode 與 GDB 的調試組合,從環(huán)境搭建的 “地基”,到基礎與高級調試操作的 “核心招式”,再到常見問題的 “破局之道”,全方位拆解這個強大工具的使用秘籍。

掌握這些技能,不僅能幫你快速定位并修復代碼 bug,更能讓你深入理解程序運行的底層邏輯,這可是成為優(yōu)秀開發(fā)者的必經之路!無論你是調試新手,還是希望進階的 “老司機”,相信接下來的內容都能讓你在實際項目中,更從容地駕馭代碼,收獲編程帶來的成就感。現(xiàn)在,就讓我們開啟這場高效調試之旅吧!

一、為什么要掌握VSCode GDB 調試

在 C/C++ 開發(fā)的世界里,調試就像是一把神奇的鑰匙,能幫我們打開隱藏在程序深處的秘密大門,找到那些潛伏著的錯誤。想象一下,你辛苦編寫了一段代碼,滿心期待它能順利運行,結果卻出現(xiàn)了各種意想不到的問題:程序崩潰、輸出結果不對、莫名奇妙的卡頓…… 這個時候,調試就派上用場了,它能讓我們深入程序內部,一步步查看程序的執(zhí)行過程,揪出那些搗亂的小 “Bug”。

VSCode,作為一款廣受歡迎的輕量級代碼編輯器,憑借其簡潔的界面、強大的插件系統(tǒng)以及跨平臺的特性,贏得了眾多開發(fā)者的心。而 GDB(GNU Debugger),則是 Linux 環(huán)境下非常強大的調試工具,它提供了豐富的命令和功能,讓我們能夠靈活地控制程序的運行,檢查變量的值,查看內存狀態(tài)等等。

當 VSCode 與 GDB 強強聯(lián)手,就形成了一個超級高效的調試組合,為我們的開發(fā)工作帶來了諸多便利和優(yōu)勢。

在開始使用 VSCode GDB 調試之前,我們需要先完成一些準備工作,確保我們的開發(fā)環(huán)境已經搭建好:

首先,我們需要安裝 VSCode 和 GDB。VSCode 可以從其官方網站(https://code.visualstudio.com/ )下載,根據(jù)你的操作系統(tǒng)選擇對應的安裝包進行下載和安裝。安裝過程非常簡單,按照提示一步一步進行即可。

GDB 的安裝方式因操作系統(tǒng)而異,以下是三種不同系統(tǒng)安裝:

①Linux 系統(tǒng):大多數(shù) Linux 發(fā)行版都可以通過包管理器來安裝 GDB。例如,在 Ubuntu 系統(tǒng)中,你可以打開終端,輸入以下命令進行安裝:

sudo apt-get install gdb

②macOS 系統(tǒng):如果你使用的是 macOS 系統(tǒng),可以通過 Homebrew 來安裝 GDB。首先確保你已經安裝了 Homebrew,然后在終端中輸入以下命令:

brew install gdb

安裝完成后,還需要進行一些額外的配置,以授予 GDB 調試權限。具體步驟可以參考 GDB 在 macOS 上的官方文檔。

③Windows 系統(tǒng):在 Windows 系統(tǒng)上安裝 GDB 相對復雜一些。你可以下載 MinGW 或 TDM - GCC,它們都包含了 GDB 調試器。以 MinGW 為例,下載安裝包后,按照安裝向導進行安裝。安裝完成后,需要將 MinGW 的 bin 目錄添加到系統(tǒng)的環(huán)境變量 PATH 中,這樣才能在命令行中使用 GDB。

安裝好 VSCode 和 GDB 之后,還需要在 VSCode 中安裝 C/C++ 擴展。打開 VSCode,點擊左側的擴展圖標(或者使用快捷鍵 Ctrl+Shift+X),在搜索框中輸入 “C/C++”,然后點擊安裝按鈕進行安裝。這個擴展為 VSCode 提供了 C/C++ 語言的語法高亮、代碼補全和調試支持等功能 ,是進行 C/C++ 調試必不可少的。

二、配置 VSCode 進行 GDB調試

2.1安裝 VSCode 和 C/C++ 擴展

①下載 VSCode:打開你常用的瀏覽器,訪問 VSCode 官方網站https://code.visualstudio.com/ 。在官網首頁,你會看到醒目的 “Download” 按鈕,點擊它。根據(jù)你的操作系統(tǒng),選擇對應的安裝包進行下載,比如 Windows 系統(tǒng)下載.exe 文件,macOS 系統(tǒng)下載.dmg 文件,Linux 系統(tǒng)則根據(jù)不同發(fā)行版選擇.deb 或.rpm 文件。下載完成后,找到安裝包并雙擊運行,按照安裝向導的提示,一步一步完成 VSCode 的安裝。

②安裝 C/C++ 擴展:啟動 VSCode,在界面左側的活動欄中,點擊擴展圖標(看起來像四個方塊組成的拼圖),或者使用快捷鍵 Ctrl+Shift+X,打開擴展面板。在搜索框中輸入 “C/C++”,這時會出現(xiàn)一系列相關的擴展,找到由 Microsoft 提供的 “C/C++” 擴展,點擊其右側的 “安裝” 按鈕。安裝過程可能需要一些時間,安裝完成后,你就可以在 VSCode 中獲得 C/C++ 語言的語法高亮、代碼補全和調試支持等功能了。

2.2安裝 GDB

⑴Windows 系統(tǒng):推薦使用 MinGW 或 TDM - GCC 來安裝 GDB。以 MinGW 為例,你可以從 MinGW 的官方網站(https://mingw.osdn.io/ )下載安裝程序。下載完成后,運行安裝程序,按照提示進行安裝。在安裝過程中,注意選擇安裝路徑,并且要確保將 MinGW 的 bin 目錄(例如 C:\MinGW\bin)添加到系統(tǒng)的環(huán)境變量 PATH 中。

這樣,你就可以在命令行中直接使用 GDB 了。安裝完成后,打開命令提示符,輸入 “gdb -v”,如果能顯示 GDB 的版本信息,說明安裝成功。

⑵Linux 系統(tǒng):在大多數(shù) Linux 發(fā)行版中,安裝 GDB 非常簡單,使用系統(tǒng)自帶的包管理器即可。比如在 Ubuntu 系統(tǒng)中,打開終端,輸入以下命令:

sudo apt-get update
sudo apt-get install gdb

第一條命令用于更新軟件源,確保獲取到最新的軟件信息;第二條命令則是安裝 GDB。安裝完成后,同樣可以在終端中輸入 “gdb -v” 來驗證安裝是否成功。

⑶macOS 系統(tǒng):利用 Homebrew 包管理器來安裝 GDB 是個不錯的選擇。首先,確保你已經安裝了 Homebrew。如果沒有安裝,可以在終端中執(zhí)行以下命令進行安裝:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安裝好 Homebrew 后,在終端中輸入以下命令安裝 GDB:

brew install gdb

不過,在 macOS 上使用 GDB 還需要進行一些額外的配置,因為系統(tǒng)的安全機制會限制 GDB 的調試權限。你需要生成一個證書并對 GDB 進行簽名,具體步驟可以參考 GDB 在 macOS 上的官方文檔或相關教程。

2.3配置 launch.json 文件

launch.json 文件是 VSCode 用于配置調試會話的重要文件,它告訴 VSCode 如何啟動調試器以及調試哪些程序。在 VSCode 中,點擊菜單欄中的 “運行”->“添加配置”,這時會彈出一個下拉菜單,選擇 “C++ (GDB/LLDB)”。VSCode 會自動生成一個默認的 launch.json 文件,并在編輯器中打開它。以下是一個示例的 launch.json 配置:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "C++ Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/a.out",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "console": "integratedTerminal",
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}
  • name:調試配置的名稱,你可以根據(jù)自己的喜好進行修改,這個名稱會顯示在 VSCode 的調試工具欄中。
  • type:調試類型,這里是 “cppdbg”,表示使用 C++ 調試器。
  • request:調試請求類型,“l(fā)aunch” 表示啟動調試會話。
  • program:要調試的程序路徑,“${workspaceFolder}” 是 VSCode 的變量,表示當前工作區(qū)文件夾,這里假設編譯后的可執(zhí)行文件名為 “a.out”,并位于工作區(qū)文件夾中。如果你的可執(zhí)行文件有其他名稱或路徑,需要相應地修改。
  • args:傳遞給程序的命令行參數(shù),這里是一個空數(shù)組,如果你的程序需要參數(shù),可以在這里添加。
  • stopAtEntry:是否在程序入口處暫停,設置為 false 表示不暫停,程序會直接運行,直到遇到斷點。
  • cwd:調試時的工作目錄,這里設置為當前工作區(qū)文件夾。
  • environment:環(huán)境變量,這里是一個空數(shù)組,如果你的程序需要特定的環(huán)境變量,可以在這里添加。
  • console:調試時使用的控制臺,“integratedTerminal” 表示使用 VSCode 集成終端。
  • MIMode:調試器的 MI 模式,這里使用 “gdb”。
  • setupCommands:在調試會話啟動前執(zhí)行的命令,這里的命令是啟用 gdb 的漂亮打印功能,使調試輸出更易讀。

2.4配置 tasks.json 文件(可選)

tasks.json 文件主要用于配置構建任務,比如編譯 C/C++ 程序。雖然不是必須配置,但對于自動化編譯程序非常有用。在 VSCode 中,按下 Ctrl+Shift+P,打開命令面板,輸入 “Tasks: Configure Default Build Task” 并回車,VSCode 會彈出一個模板選擇列表,選擇 “C/C++: g++ build active file”(如果你使用的是 gcc 編譯器,選擇相應的 gcc 選項)。VSCode 會在工作區(qū)的.vscode 文件夾下生成一個 tasks.json 文件,內容如下:

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "g++ build active file",
            "command": "g++",
            "args": [
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "echo": true,
                "reveal": "always",
                "focus": false,
                "panel": "shared",
                "showReuseMessage": true,
                "clear": false
            },
            "problemMatcher": ["$gcc"]
        }
    ]
}

作用及示例解釋:這個配置表示使用 g++ 編譯器來編譯當前活動文件。

  • “command” 指定了使用的編譯器是 g++,
  • “args” 數(shù)組中包含了編譯選項和參數(shù),
  • “-g” 表示生成調試信息,
  • “\({file}”表示當前活動文件,
  • “-o”表示輸出文件,
  • “\){fileDirname}/${fileBasenameNoExtension}” 表示輸出文件的路徑和名稱,與當前活動文件在同一目錄下,且去掉了文件擴展名。
  • “group” 部分將這個任務標記為構建任務,并設置為默認任務。

這樣,在 VSCode 中按下 Ctrl+Shift+B,就會自動執(zhí)行這個編譯任務,生成可執(zhí)行文件,方便后續(xù)的調試。如果你的項目有特殊的編譯需求,比如需要鏈接特定的庫、使用不同的編譯選項等,可以根據(jù)實際情況修改 “args” 數(shù)組中的內容。

三、VSCode基礎調試操作

3.1設置斷點

在 VSCode 中,設置斷點是調試的基礎操作,就像在地圖上標記重要地點一樣,它能讓程序在執(zhí)行到特定代碼行時暫停,方便我們檢查程序狀態(tài)。設置斷點有兩種常見的方法。

一種是非常直觀的圖形化操作,當你打開需要調試的代碼文件后,只需將鼠標移動到代碼左側邊緣,也就是行號旁邊的空白區(qū)域,點擊一下,就會出現(xiàn)一個醒目的紅點 ,這就是斷點。比如,在下面這段簡單的 C++ 代碼中:

#include <iostream>
int main() {
    int a = 10;
    int b = 20;
    int sum = a + b;
    std::cout << "The sum is: " << sum << std::endl;
    return 0;
}

如果你想檢查變量sum的計算結果,就可以在int sum = a + b;這一行的左側點擊設置斷點。

另一種方法是在 GDB 控制臺中使用命令來設置斷點。在 VSCode 的調試控制臺中輸入break命令,后面跟上要設置斷點的行號或者函數(shù)名。例如,break 5表示在第 5 行設置斷點;如果要在某個函數(shù)中設置斷點,比如void func()函數(shù),就可以輸入break func。這種方式在一些復雜的調試場景中,比如在大型項目中需要根據(jù)函數(shù)名快速定位斷點時,非常實用。

除了普通斷點,VSCode 還支持設置條件斷點、日志斷點和函數(shù)斷點等高級斷點類型。條件斷點允許你設置一個條件表達式,只有當條件滿足時,斷點才會觸發(fā)。比如,在一個循環(huán)中,你只想在某個變量達到特定值時暫停程序,就可以設置條件斷點。在普通斷點上右鍵單擊,選擇 “添加條件”,然后輸入條件表達式,如i == 10,表示當變量i等于 10 時觸發(fā)斷點 。日志斷點則是在斷點處打印一條消息,而不是暫停程序執(zhí)行,這對于跟蹤程序的執(zhí)行流程很有幫助。函數(shù)斷點則是在函數(shù)入口處設置斷點,方便對函數(shù)的執(zhí)行進行調試。

3.2運行和繼續(xù)

設置好斷點后,就可以開始調試程序了。在 VSCode 中,有兩種常見的方式來啟動調試。一種是點擊 VSCode 界面上方調試工具欄中的綠色三角形 “開始調試” 按鈕,這個按鈕就像是啟動汽車的鑰匙,按下它,調試之旅就開始了。另一種方式是在 GDB 控制臺中輸入run命令,也可以縮寫為r。當你執(zhí)行這兩種操作之一后,程序就會開始運行,直到遇到第一個斷點才會暫停。

當程序暫停在斷點處時,如果你想讓程序繼續(xù)執(zhí)行,直到遇到下一個斷點或者程序結束,可以在調試工具欄中點擊 “繼續(xù)” 按鈕,它的圖標是一個向右的三角形。在 GDB 控制臺中,也可以輸入continue命令,縮寫為c。比如,在上面的代碼中,程序在int sum = a + b;這一行的斷點處暫停后,你執(zhí)行continue命令,程序就會繼續(xù)執(zhí)行,直到遇到下一個斷點或者return 0;語句,程序結束。

3.3查看變量

在調試過程中,查看變量的值是非常重要的操作,它能幫助我們了解程序在運行過程中的狀態(tài),判斷程序是否按照我們預期的方式執(zhí)行。在 VSCode 中,查看變量值有兩種主要方式。一種是通過調試側邊欄,當程序暫停在斷點處時,VSCode 左側的調試側邊欄會顯示 “變量” 面板。在這個面板中,會列出當前作用域中的所有變量及其值,包括局部變量、全局變量等。

比如,在前面的代碼中,當程序暫停在int sum = a + b;這一行的斷點處時,“變量” 面板中就會顯示變量a、b的值,你可以直觀地看到它們當前的取值。如果變量是一個復雜的數(shù)據(jù)結構,比如數(shù)組、結構體或對象,還可以展開它們,查看內部的成員變量的值。

另一種方式是在 GDB 控制臺中使用print命令,縮寫為p。在控制臺中輸入print加上變量名,就可以打印出該變量的值。例如,輸入print sum,就會輸出變量sum的值。這種方式在需要快速查看某個特定變量的值時非常方便,尤其是當你不想在側邊欄中查找變量時。此外,print命令還可以用于計算和打印表達式的值,比如print a + b,它會計算a + b的結果并打印出來 ,這對于調試復雜的表達式非常有用。

3.4單步執(zhí)行

單步執(zhí)行是調試中常用的操作,它允許我們逐行執(zhí)行代碼,仔細觀察程序的執(zhí)行流程和變量的變化情況。在 GDB 中,有兩個重要的單步執(zhí)行命令:step和next。step命令會進入函數(shù)內部執(zhí)行,如果你在調用某個函數(shù)的代碼行上使用step命令,調試器會進入這個函數(shù),讓你可以逐行查看函數(shù)內部的代碼執(zhí)行情況。例如,假設有如下代碼:

#include <iostream>
void func(int num) {
    int result = num * 2;
    std::cout << "The result in func is: " << result << std::endl;
}
int main() {
    int a = 5;
    func(a);
    return 0;
}

當程序暫停在func(a);這一行時,使用step命令,調試器就會進入func函數(shù),你可以看到int result = num * 2;這一行的執(zhí)行過程,以及變量result的計算結果。

而next命令則會跳過函數(shù)調用,直接執(zhí)行下一行代碼。還是以上面的代碼為例,當程序暫停在func(a);這一行時,使用next命令,調試器會直接執(zhí)行func函數(shù)調用之后的代碼,也就是return 0;這一行,而不會進入func函數(shù)內部。

next命令適用于你已經了解某個函數(shù)的功能,不需要深入查看其內部執(zhí)行過程的情況,這樣可以加快調試速度,快速跳過一些你不關心的代碼段 。通過靈活使用step和next命令,我們可以更細致地跟蹤程序的執(zhí)行流程,準確找到程序中出現(xiàn)問題的地方。

3.5觀察點

觀察點是一種特殊的斷點,它的作用是當某個表達式的值發(fā)生改變時,程序會自動暫停執(zhí)行,這對于追蹤變量的變化非常有用。比如,在一個復雜的程序中,你可能很難確定某個變量在什么地方被修改了,這時觀察點就能派上用場。在 GDB 控制臺中,使用watch命令來設置觀察點。例如,有如下代碼:

#include <iostream>
int main() {
    int count = 0;
    while (count < 10) {
        count++;
        std::cout << "count is: " << count << std::endl;
    }
    return 0;
}

如果你想知道變量count在什么時候被修改,可以在 GDB 控制臺中輸入watch count,這樣當count的值發(fā)生變化時,程序就會暫停在修改count的那一行代碼處。此時,你可以查看程序的狀態(tài),了解為什么count會發(fā)生這樣的變化。除了簡單的變量,watch命令也可以用于觀察復雜的表達式。

比如watch a + b,當a + b的計算結果發(fā)生變化時,程序就會暫停,這對于調試涉及多個變量運算的代碼非常有幫助 。通過設置觀察點,我們可以更精準地監(jiān)控程序中變量和表達式的變化,提高調試的效率和準確性。

3.6調整執(zhí)行流程

在調試過程中,有時候我們可能需要改變程序的執(zhí)行流程,跳過一些不需要執(zhí)行的代碼,或者重新執(zhí)行某一段代碼。這時候,jump命令就派上用場了。jump命令可以讓我們在調試過程中直接跳轉到指定的內存地址或者代碼行繼續(xù)執(zhí)行程序。例如,假設有如下代碼:

#include <iostream>
int main() {
    int num = 1;
    for (int i = 0; i < 5; i++) {
        num = num * (i + 1);
        std::cout << "num is: " << num << std::endl;
    }
    return 0;
}

當程序在循環(huán)中執(zhí)行時,如果你已經確定前面的循環(huán)執(zhí)行沒有問題,想要直接跳轉到循環(huán)結束后的代碼行繼續(xù)執(zhí)行,可以在 GDB 控制臺中使用jump命令。首先,你需要知道循環(huán)結束后的代碼行的行號或者對應的內存地址。假設循環(huán)結束后的代碼行是return 0;,其行號為 8,那么你可以在 GDB 控制臺中輸入jump 8,程序就會直接跳轉到return 0;這一行繼續(xù)執(zhí)行。

jump命令也可以根據(jù)內存地址來跳轉。你可以使用info line命令查看某一行代碼的內存地址,然后使用jump命令加上內存地址來實現(xiàn)跳轉。例如,info line 8會顯示第 8 行代碼的內存地址,假設為0x123456,那么jump *0x123456就可以跳轉到該內存地址處繼續(xù)執(zhí)行程序 。通過使用jump命令,我們可以靈活地調整程序的執(zhí)行流程,快速定位到我們關心的代碼部分進行調試,提高調試的效率。

四、高級調試技巧

4.1使用條件斷點

條件斷點是一種非常強大的調試工具,它允許我們在特定條件滿足時才觸發(fā)斷點,這在處理復雜邏輯和循環(huán)結構時特別有用。例如,在一個大型的循環(huán)中,我們可能只關心當某個變量達到特定值時程序的執(zhí)行狀態(tài),如果使用普通斷點,我們需要手動多次跳過循環(huán),直到變量達到目標值,這無疑是非常繁瑣的。而條件斷點可以幫我們解決這個問題。

假設我們有如下代碼:

#include <iostream>
int main() {
    int num = 0;
    for (int i = 0; i < 100; i++) {
        num = num + i;
        if (num > 500) {
            std::cout << "num exceeds 500: " << num << std::endl;
        }
    }
    return 0;
}

如果我們想在num超過 500 時暫停程序,查看此時的變量狀態(tài)和程序執(zhí)行情況,可以在if (num > 500)這一行設置條件斷點。在 VSCode 中,設置條件斷點的方法是在普通斷點上右鍵單擊,選擇 “添加條件”,然后輸入條件表達式num > 500。這樣,當程序執(zhí)行到這一行時,只有當num的值確實超過 500,斷點才會觸發(fā),程序才會暫停。通過這種方式,我們可以快速定位到我們關心的程序執(zhí)行點,大大提高調試效率 。

4.2多線程調試

在現(xiàn)代軟件開發(fā)中,多線程編程越來越常見,因為它可以充分利用多核處理器的優(yōu)勢,提高程序的執(zhí)行效率和響應速度。然而,多線程編程也帶來了一些調試上的挑戰(zhàn),比如線程同步問題、資源競爭問題等。因此,掌握多線程調試技巧對于開發(fā)高質量的多線程程序至關重要。

在 VSCode 中進行多線程調試,首先要確保你的開發(fā)環(huán)境已經配置好相應的編譯器和運行時庫,并且熟悉程序中使用的同步機制,如互斥鎖、信號量等,這些是確保線程安全的關鍵。

VSCode 提供了直觀的多線程調試功能。當程序在調試過程中暫停時,你可以在調試側邊欄的 “線程” 面板中看到所有正在運行的線程列表。通過點擊不同的線程,你可以切換到該線程的執(zhí)行上下文,查看該線程的變量值、調用棧等信息。例如,假設有如下多線程代碼:

#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void print_id(int id) {
    std::lock_guard<std::mutex> guard(mtx);
    std::cout << "thread " << id << '\n';
}
void do_work() {
    for (int i = 0; i < 5; i++) {
        print_id(i);
    }
}
int main() {
    std::thread threads[5];
    for (int i = 0; i < 5; i++) {
        threads[i] = std::thread(do_work);
    }
    for (auto& th : threads) {
        th.join();
    }
    return 0;
}

在調試這個程序時,當程序暫停在某個斷點處,你可以在 “線程” 面板中看到 5 個線程,每個線程都有自己的執(zhí)行狀態(tài)和調用棧。你可以選擇某個線程,然后使用單步執(zhí)行、繼續(xù)等調試操作,觀察該線程的執(zhí)行情況。

此外,VSCode 還支持設置線程特定的斷點。你可以在代碼的某一行上右鍵單擊,選擇 “條件斷點”,然后在彈出的對話框中,不僅可以設置條件表達式,還可以選擇 “線程 ID”,輸入你想要在哪個線程上觸發(fā)斷點的 ID。這樣,當指定的線程執(zhí)行到這一行時,斷點才會觸發(fā),方便你對特定線程進行調試 。

4.3遠程調試

在實際開發(fā)中,我們經常會遇到這樣的情況:代碼運行在遠程服務器上,或者在嵌入式設備等本地環(huán)境無法直接運行的平臺上,這時候就需要用到遠程調試。遠程調試允許我們在本地開發(fā)環(huán)境中,對遠程目標上運行的程序進行調試,就像程序在本地運行一樣方便。

使用 VSCode 進行遠程 GDB 調試,一般需要以下步驟:

⑴安裝必要擴展:在本地的 VSCode 中,點擊左側的 “擴展” 圖標,搜索并安裝 “C/C++” 擴展和 “Remote - SSH” 擴展。“C/C++” 擴展為 C/C++ 代碼的編輯和調試提供支持,而 “Remote - SSH” 擴展則是實現(xiàn)遠程連接的關鍵。

⑵連接到遠程服務器:點擊 VSCode 左下角的綠色圖標,選擇 “Remote-SSH: Connect to Host...” 選項,然后輸入遠程服務器的 SSH 連接信息,包括用戶名和主機名(IP 地址或域名)。如果需要使用私鑰進行連接,還需要配置私鑰路徑。連接成功后,VSCode 會在新窗口中打開遠程服務器的文件系統(tǒng),你可以在這個窗口中編輯和查看遠程服務器上的 C/C++ 代碼。

⑶配置遠程開發(fā)環(huán)境:確保在遠程服務器上安裝了 C/C++ 編譯器(如 gcc/g++)和 GNU Debugger(GDB)。如果沒有安裝,可以使用服務器系統(tǒng)的包管理器進行安裝,例如在 Ubuntu 系統(tǒng)中,可以使用sudo apt - get install build - essential gdb命令進行安裝。

⑷創(chuàng)建調試配置:在 VSCode 中,打開你的 C/C++ 代碼文件,點擊左側的調試圖標,然后點擊齒輪圖標以創(chuàng)建新的調試配置。選擇 “C++ (GDB/LLDB)” 作為調試環(huán)境,在調試配置中,配置 “program” 字段為編譯后的可執(zhí)行文件的路徑。如果你的程序需要傳遞命令行參數(shù),還可以在 “args” 字段中添加相應的參數(shù)。例如,以下是一個簡單的調試配置示例:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Remote C++ Debug",
            "type": "cppdbg",
            "request": "launch",
            "program": "/path/to/your/executable",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "console": "integratedTerminal",
            "MIMode": "gdb",
            "miDebuggerServerAddress": "your_remote_server_ip:1234",
            "setupCommands": [
                {
                    "description": "Enable pretty - printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }
    ]
}

其中,“miDebuggerServerAddress” 字段指定了遠程服務器的 IP 地址和調試端口(這里假設端口為 1234,你可以根據(jù)實際情況修改)。

⑸開始遠程 GDB 調試:在 C/C++ 代碼文件中設置斷點,然后點擊調試工具欄上的 “開始調試” 按鈕。VSCode 將通過 SSH 連接到遠程服務器,并啟動遠程 GDB 調試會話。此時,你就可以像在本地調試一樣,使用調試工具欄上的按鈕來執(zhí)行調試操作,如步進、繼續(xù)、停止等,查看遠程程序的執(zhí)行狀態(tài)和變量值 。通過遠程調試,我們可以方便地對運行在遠程服務器或其他設備上的程序進行調試,大大提高了開發(fā)和調試的效率。

4.3常見問題及解決方法

在使用 VSCode GDB 調試的過程中,可能會遇到一些常見問題,下面為你列舉并提供相應的解決方法:

①無法找到 GDB

這可能是因為 GDB 沒有正確安裝,或者安裝路徑沒有添加到系統(tǒng)環(huán)境變量中。你可以通過在命令行中輸入 “gdb -v” 來檢查 GDB 是否安裝成功。如果提示 “gdb 不是內部或外部命令”,說明 GDB 未正確配置。解決方法是重新安裝 GDB,并確保將 GDB 的安裝路徑添加到系統(tǒng)環(huán)境變量 PATH 中。例如,在 Windows 系統(tǒng)中,如果 GDB 安裝在 “C:\MinGW\bin” 目錄下,需要將該目錄添加到 PATH 變量中。

②調試配置錯誤

launch.json 文件中的配置錯誤可能導致調試無法正常啟動。比如,“program” 字段指定的可執(zhí)行文件路徑錯誤,或者 “MIMode” 設置不正確。解決這個問題的方法是仔細檢查 launch.json 文件中的各項配置,確保路徑、參數(shù)等設置正確無誤。可以參考前面提到的 launch.json 配置示例,根據(jù)自己的項目實際情況進行調整。

③斷點無效

有時設置了斷點,但程序運行時卻不會在斷點處暫停。這可能是因為源代碼和生成的可執(zhí)行文件不同步,例如代碼修改后沒有重新編譯。解決辦法是在設置斷點之前,確保代碼已經重新編譯,生成了最新的可執(zhí)行文件。另外,斷點位置也可能影響其有效性,如果斷點設置在不可執(zhí)行的代碼行,如注釋行或空行,自然不會生效,需要將斷點設置在有效的代碼行上。

④VSCode 無法連接 GDB 服務器

在進行遠程調試時,可能會遇到 VSCode 無法連接到 GDB 服務器的問題。這可能是由于網絡限制、端口被占用或者配置文件中的 IP 地址和端口設置錯誤。首先,檢查網絡連接是否正常,確保遠程服務器的 IP 地址和端口可以正常訪問。然后,檢查 launch.json 文件中的 “miDebuggerServerAddress” 字段,確保設置的 IP 地址和端口正確無誤。如果端口被占用,可以嘗試更換其他未被占用的端口 。同時,還要檢查防火墻設置,確保沒有阻止 VSCode 與 GDB 服務器之間的通信。

責任編輯:武曉燕 來源: 深度Linux
相關推薦

2010-08-04 18:03:27

NFS服務器

2021-06-23 06:30:14

H5 移動端前端開發(fā)

2010-04-23 14:04:23

Oracle日期操作

2024-05-07 09:01:21

Queue 模塊Python線程安全隊列

2013-04-15 10:48:16

Xcode ARC詳解iOS ARC使用

2013-06-08 11:13:00

Android開發(fā)XML解析

2009-07-04 11:05:48

Linux安全攻略

2021-04-23 20:59:02

ThreadLocal內存

2011-10-31 14:44:49

2009-02-20 11:43:22

UNIXfish全攻略

2009-12-14 14:32:38

動態(tài)路由配置

2009-10-19 15:20:01

家庭綜合布線

2014-03-19 17:22:33

2010-01-21 12:57:25

FC存儲交換機

2015-03-04 13:53:33

MySQL數(shù)據(jù)庫優(yōu)化SQL優(yōu)化

2022-10-21 11:30:42

用戶生命周期分析

2009-10-12 15:06:59

2009-07-04 11:26:12

unix應急安全攻略

2010-10-11 13:54:03

Windows Ser

2020-12-28 10:50:09

Linux環(huán)境變量命令
點贊
收藏

51CTO技術棧公眾號

精品综合在线| 黄色美女一级片| av中文字幕一区二区| 欧美日韩另类一区| 2021狠狠干| 天天爽夜夜爽夜夜爽| 日韩成人av影视| 九九热r在线视频精品| 日本japanese极品少妇| 97人人做人人爽香蕉精品| 综合久久一区二区三区| 久久99精品久久久久久青青日本| 最近国语视频在线观看免费播放| 欧美永久精品| 亚洲天堂av网| 老女人性生活视频| a日韩av网址| 亚洲黄色av一区| 日本日本精品二区免费| 成 人片 黄 色 大 片| 欧美成人精品一区二区免费看片| a视频在线免费看| 91原创在线视频| 91免费在线视频网站| 五月婷婷视频在线| 欧美激情麻豆| 自拍偷拍亚洲在线| 添女人荫蒂视频| 日韩中文字幕一区二区高清99| 色8久久精品久久久久久蜜| 黄色成人在线免费观看| 97电影在线| 99在线精品视频| 亚洲在线一区二区| 中国女人真人一级毛片| 老鸭窝91久久精品色噜噜导演| 久久久久www| 欧美精品日韩在线| 蜜桃一区二区三区| 日韩av在线免播放器| 超碰在线资源站| 91亚洲视频| 91黄色免费版| caopor在线视频| 亚洲女色av| 性做久久久久久免费观看| 国产树林野战在线播放| 日本视频在线免费观看| 亚洲国产成人一区二区三区| 欧美极品一区| 五月婷在线视频| 成人免费av在线| 99理论电影网| 亚洲精华国产精华精华液网站| 激情欧美一区二区三区在线观看| 国产精品一二三视频| 91成人伦理在线电影| 伊人成人免费视频| 午夜不卡一区| 欧美福利视频一区| 爱豆国产剧免费观看大全剧苏畅| 成人在线中文| 欧美日韩卡一卡二| 一起操在线视频| 免费成人高清在线视频| 欧美日韩亚洲综合一区二区三区| 久久久国产欧美| 成人国产精品| 91精品国产一区二区| 中文字幕第三区| 99精品国产一区二区三区2021| 日韩一级完整毛片| 国产在线观看免费播放| 欧美韩一区二区| 国产视频在线一区二区| 中文字幕在线看高清电影| 欧美精品一区二区三区精品| 日韩在线一区二区三区免费视频| 三级黄色在线观看| 欧美日韩hd| 97欧美精品一区二区三区| 天天干,天天干| 免费成人你懂的| 亚洲mm色国产网站| 殴美一级特黄aaaaaa| 91美女片黄在线观看| 日韩精品久久久免费观看 | 制服丝袜在线第一页| 一级aaaa毛片| 国产美女在线精品| 国产精品伊人日日| 国产系列电影在线播放网址| 中文字幕亚洲不卡| 久久这里只有精品18| 午夜精品久久久久久久久久蜜桃| 欧美高清视频一二三区| jjzz黄色片| av一区二区高清| 欧美高清videos高潮hd| 久久久久性色av无码一区二区| 国产农村妇女精品一区二区| 国产精品网站视频| 欧美性猛交 xxxx| 欧美国产一区视频在线观看| 久久久国内精品| 美女福利一区二区| 日韩免费一区二区| 欧美熟妇激情一区二区三区| 午夜日韩av| 国产精品免费电影| 黄频网站在线观看| 亚洲欧洲韩国日本视频| 久久国产成人精品国产成人亚洲| 国产成年精品| 在线观看国产精品日韩av| 免费在线观看黄视频| 青青青伊人色综合久久| 久草精品电影| 伊人影院在线视频| 精品污污网站免费看| 国产高清成人久久| 亚洲九九视频| 国产精品伦子伦免费视频| 天堂av一区二区三区| 亚洲婷婷综合色高清在线| 一本色道无码道dvd在线观看| 中文字幕亚洲在线观看| 精品国偷自产在线视频| 免费看一级视频| www.日韩在线| 成人在线观看毛片| 欧美成人三级| 亚洲网站在线播放| 亚洲 欧美 日韩 综合| 国产激情一区二区三区桃花岛亚洲| 日韩国产一区久久| 欧美magnet| 亚洲精品suv精品一区二区| 九九视频免费看| 国产综合色视频| 亚洲欧美日韩不卡一区二区三区| 精精国产xxxx视频在线野外| 精品久久久久久久久久久久久久久| 污污的视频在线免费观看| 日韩av电影天堂| 四虎影院一区二区三区 | 久久久久久久久久久9不雅视频| 日韩av手机在线| 爽爽视频在线观看| 精品日本美女福利在线观看| 亚洲高清无码久久| 一本久道久久综合狠狠爱| 国产自产精品| 日韩av影片| 亚洲日韩第一页| 波多野结衣二区三区| 欧美中文一区| 久久久国产一区二区三区四区小说 | 99riav一区二区三区| 男女超爽视频免费播放| 成人搞黄视频| 97婷婷涩涩精品一区| 日本黄色免费视频| 欧美日韩一二三四五区| 蜜桃精品一区二区| 日本亚洲欧美天堂免费| 一本久道久久综合狠狠爱亚洲精品| 国产原创一区| 久久福利网址导航| 人妻与黑人一区二区三区| 香蕉av福利精品导航| 久久人人妻人人人人妻性色av| 亚洲永久字幕| 水蜜桃一区二区| 国产精品中文| 国色天香2019中文字幕在线观看| 人妻无码一区二区三区久久99| 亚洲一区二区在线视频| 久久国产精品影院| 肉色丝袜一区二区| 欧美精品久久96人妻无码| 盗摄牛牛av影视一区二区| 啪一啪鲁一鲁2019在线视频| aaa在线观看| 精品三级在线看| 久久久久久久久黄色| 国产精品传媒视频| 成年人小视频在线观看| 日韩中文字幕区一区有砖一区| 自拍偷拍99| 国产精品2023| 国产在线视频不卡| av中文在线资源库| 日韩在线精品视频| 天天操天天干天天舔| 欧美性猛片aaaaaaa做受| 欧美日韩综合一区二区| 久久女同性恋中文字幕| 在线免费黄色网| 99在线观看免费视频精品观看| 亚洲成人自拍视频| 国偷自产av一区二区三区| 国产精品美女久久久久av超清| 少女频道在线观看免费播放电视剧| 亚洲欧美日韩一区二区在线 | 精品一区在线看| 久激情内射婷内射蜜桃| 91一区二区| 就去色蜜桃综合| 欧美久久亚洲| 国产精品情侣自拍| 阿v视频在线| 久久精品视频在线| 黄色av免费在线观看| 精品人在线二区三区| 在线观看亚洲国产| 日韩欧美在线国产| 久久高清无码视频| 亚洲欧美综合网| av男人的天堂av| a级高清视频欧美日韩| 久久久久久久久久久久久久久国产| 午夜在线视频观看日韩17c| 国产一级做a爰片久久毛片男| 日本欧美肥老太交大片| 免费看污久久久| 激情小说亚洲色图| 99在线高清视频在线播放| 国产精品久久久久77777丨| 2020国产精品视频| 成人免费高清观看| 欧美乱大交xxxxx| 理论片午午伦夜理片在线播放| 亚洲欧美中文另类| 性xxxx视频播放免费| 精品av综合导航| 午夜精品久久久久久久第一页按摩| 欧美精品 国产精品| 中日韩av在线| 欧美视频在线一区| a片在线免费观看| 日本韩国欧美三级| 黄色片视频免费| 一本久道久久综合中文字幕| 综合激情网五月| 福利视频一区二区| 97免费在线观看视频| 亚洲 欧美综合在线网络| 国产一级视频在线| 亚洲一区二区免费视频| 久草视频免费在线| 亚洲一区二区在线播放相泽| 欧美日韩一级在线观看| 亚洲一区二区三区中文字幕| 99re国产视频| 超碰在线免费公开| 久久国产精品久久久久| 2024最新电影在线免费观看| 操人视频在线观看欧美| 青青草原av在线| 久久久久久12| 两个人看的在线视频www| 欧美一区第一页| 欧美色999| 91精品美女在线| 久久wwww| 国产在线欧美日韩| 国产欧美日韩一区二区三区四区 | 999在线观看| 久久99热狠狠色一区二区| 国产欧美精品一二三| 国产精品1024| 中文字幕xxx| 日本一区二区视频在线观看| 精品视频第一页| 夜夜爽夜夜爽精品视频| 日本一级一片免费视频| 在线免费观看日本一区| 国产一区二区在线视频聊天| 精品女同一区二区| 牛牛热在线视频| 色偷偷av亚洲男人的天堂| 在线视频国产区| 91国产精品91| 韩国精品视频在线观看| 91精品国产综合久久久久久丝袜| 天堂日韩电影| 国产精品夜夜夜爽张柏芝| 亚洲激情社区| 日韩一区二区三区不卡视频| 国产电影精品久久禁18| 精品人妻一区二区三区视频| 中文字幕在线免费不卡| 男人天堂中文字幕| 欧美日韩一区精品| 成人爽a毛片一区二区| 国产一区二区三区在线| 天堂亚洲精品| 国产精品99久久99久久久二8| 日韩成人精品| 日韩一区免费观看| 亚洲一级一区| 成 人 黄 色 小说网站 s色| 97久久精品人人爽人人爽蜜臀 | 精品理论电影| 国产毛片久久久久久国产毛片| 首页综合国产亚洲丝袜| www日本在线观看| 国产精品天干天干在线综合| 日韩无码精品一区二区三区| 欧美区视频在线观看| 天堂v视频永久在线播放| 欧美成aaa人片免费看| 亚洲成人av观看| 精品国产一区二区三| 91精品观看| 午夜精品在线免费观看| 91色porny在线视频| 免费在线黄色片| 欧美精品色一区二区三区| 免费a级毛片在线观看| 高清欧美性猛交| 欧美一级大片在线视频| 亚洲最大免费| 日韩精品一区第一页| www.自拍偷拍| 欧美日韩激情小视频| 黄色一级a毛片| 久久亚洲春色中文字幕| 久久青草免费| 少妇免费毛片久久久久久久久| 亚洲一区国产| 蜜臀av粉嫩av懂色av| 一区二区三区丝袜| aaa国产视频| 久久高清视频免费| 国产美女视频一区二区| 亚洲永久一区二区三区在线| 久久永久免费| 欧美多人猛交狂配| 色94色欧美sute亚洲13| 国产精品一区二区三区四区色| 日韩av黄色在线观看| 亚洲精华一区二区三区| www.com毛片| 久久综合一区二区| 国产成人无码av| 亚洲色图国产精品| 桃子视频成人app| 日本高清不卡一区二区三| 日韩精品一级二级| 超碰人人人人人人人| 欧美午夜不卡视频| 日本在线天堂| 91香蕉国产在线观看| 欧美精品九九| 国产chinese中国hdxxxx| 午夜精品一区在线观看| 西西人体44www大胆无码| 青草热久免费精品视频| 九九免费精品视频在线观看| 91av俱乐部| 亚洲欧美中日韩| 亚洲av色香蕉一区二区三区| 国内精品久久久久久中文字幕| 日韩极品在线| 亚洲最大综合网| 亚洲欧洲av在线| 免费观看国产视频| 日本亚洲欧美成人| 日本不卡二三区| 欧美人与性动交α欧美精品| 亚洲国产精品一区二区久久恐怖片| 西西人体44www大胆无码| 国产精品国语对白| 一区二区三区在线| av漫画在线观看| 色婷婷久久99综合精品jk白丝 | 国产精品色眯眯| 国产乱码一区二区| 97色在线视频观看| 欧美亚洲国产激情| 精品人妻一区二区乱码| 都市激情亚洲色图| 中文字幕在线观看日本| 成人女人免费毛片| 久久黄色网页| 成人免费毛片东京热| 精品视频在线播放免| 91视频成人| 欧美亚洲另类色图| 亚洲精品视频在线观看免费| ijzzijzzij亚洲大全| 青青一区二区| 天天爽人人爽夜夜爽| 亚洲一区二区三区视频在线| 成年女人的天堂在线| 国产精品三区www17con| 免费不卡在线视频| 青草视频在线观看免费|