通常在 PC 端會啟動一個 server 程式,而 Android Device 的 client 程式想要連到 PC 端的 server,除了使用 ip 的方式連線以外,沒有 ip 的話,還可以利用 USB 連線的方式,也就是透過 adb reverse 轉發 port,如此一來 Android Device 的 client 程式就可以連上 PC 端的 server 程式,
$ gdb ./a.out GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1 Copyright (C) 2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty"for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration"for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type"help". Type "apropos word" to search for commands related to "word"... Reading symbols from a.out...done. (gdb)
輸入 b main.cpp:14 插入中斷點在 main.cpp 的 14 行,
1 2 3
(gdb) b main.cpp:14 Breakpoint 1 at 0x400c09: file main.cpp, line 14. (gdb)
輸入 info b 印出目前設定的中斷點,
1 2 3 4
(gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000400c09 in main() at main.cpp:14 (gdb)
按下 r 開始執行,
1 2 3 4 5 6 7
(gdb) r Starting program: /home/shengyu/a.out hello world
Breakpoint 1, main () at main.cpp:14 14 std::cout << "sum=" << sum << "\n"; (gdb)
再次輸入 info b 印出目前設定的中斷點,可以看到中斷點被觸發幾次,
1 2 3 4 5
(gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000400c09 in main() at main.cpp:14 breakpoint already hit 1 time (gdb)
接著按 c 繼續執行直到程式結束,
1 2 3 4 5 6
(gdb) c Continuing. sum=10 end [Inferior 1 (process 14925) exited normally] (gdb)
以下為 gdb 常用的指令, r:run 開始執行 c:continue 繼續執行 b main.cpp:14:設定中斷點 info b:印出目前設定的中斷點 bt:backtrace 印出程式呼叫的堆疊 q:quit 離開
如果在除錯的過程中逐步執行發現跳不到原始碼遇到 Could not load source ... 'SourceRequest' not supported 這樣的錯誤訊息的話,可能就是找不到原始碼的路徑,可能就是因為執行檔跟原始碼擺放路徑不同,解決方式就是在 launch.json 使用 sourceFileMap 將正確的路徑對應好,再次啟動就可以正確找到了~~
以上就是 Ubuntu 使用 VS Code Debugger 除錯介紹, 如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
一般 gdb 除錯時是使用 r 開始執行程式。不過遠端除錯時,遠端的 gdbserver 已經 run 了,所以 gdb 要用 c 來繼續執行,不能用 r。
以下為 gdb 常用的指令, r:run 開始執行 c:continue 繼續執行 b samplehello.cpp:14:設定中斷點 info b:印出目前設定的中斷點 bt:backtrace 印出程式呼叫的堆疊 q:quit 離開
確定基本的 gdbserver 與 gdb 都可以正常地遠端偵錯後,我們就來開始進行 VS Code 遠端偵錯的設定吧!
VS Code 遠端偵錯設定
VS Code 的 .vscode/launch.json 設定檔資訊如下,其中重點是 miDebuggerServerAddress 要設定對,例如本範例的 PC 本地端 port 20001 (轉發到 Android Device 遠端的 port 20002),miDebuggerPath 是 gdb 執行檔的路徑,最後是 program 要除錯的執行檔路徑,
{ // 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": "Remote GDB", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/out/target/product/<product_name>/symbols/vendor/bin/samplehello", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "miDebuggerServerAddress": "localhost:20001", "miDebuggerPath": "${workspaceFolder}/prebuilts/gdb/linux-x86/bin/gdb" //"miDebuggerPath": "/opt/android-ndk-r13b/prebuilt/linux-x86_64/bin/gdb" } ] }
VS Code 錯誤排除
如果在除錯的過程中逐步執行發現跳不到原始碼遇到 Could not load source ... 'SourceRequest' not supported 這樣的錯誤訊息的話,可能就是找不到原始碼的路徑,可能就是因為執行檔跟原始碼擺放路徑不同,解決方式就是在 launch.json 使用 sourceFileMap 將正確的路徑對應好,再次啟動就可以正確找到了~~
通常在 Android Device 會啟動一個 server 程式,而 PC 端的 client 程式想要連到 Android Device 的 server,除了使用 ip 的方式連線以外,沒有 ip 的話,還可以利用 USB 連線的方式,也就是透過 adb forward 轉發 port,如此一來 PC 端的 client 程式就可以連上 Android Device 的 server 程式,
如果在除錯的過程中逐步執行發現跳不到原始碼遇到 Could not load source ... 'SourceRequest' not supported 這樣的錯誤訊息的話,可能就是找不到原始碼的路徑,可能就是因為執行檔跟原始碼擺放路徑不同,解決方式就是在 launch.json 使用 sourceFileMap 將正確的路徑對應好,再次啟動就可以正確找到了~~
以上就是 macOS 使用 VS Code Debugger 除錯介紹, 如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!