gdbserver远程调试

本文详细介绍了如何使用GDB进行远程调试,包括在目标服务器上部署gdbserver和调试程序,以及在宿主机上配置gdb进行连接。通过具体步骤和实例,帮助读者掌握远程调试的设置与操作。

转载请注明:https://blog.youkuaiyun.com/fuqiangnxn/article/details/94080961

yum安装:

yum install gdb

yum install gdb-gdbserver

 

gdb 远程调试,可以让代码只在一台服务器上(宿主服务器), 然后把debug版本的程序放到目标机上进行远程调试,避免代码被复制出去。

gdb 远程调试,需要在远端目标服务器上部署 gdbserver 和要调试的程序,在宿主机上运行gdb。

默认 linux 没带 gdbserver,需要自己源码编译。

到 https://ftp.gnu.org/gnu/gdb/ 下载 gdb源码,redhat 6.x 系列都是 gdb-7.2a.tar.bz2

tar xfj gdb-7.2a.tar.bz2

cd gdb-7.2

cd gdb/gdbserver

./configure --prefix=$HOME/local/gdb

make

make install

只需要把 $HOME/local/gdb/bin/gdbserver 复制到目标服务器上即可。

查看帮助:

man -M ~/local/gdb/share/man gdbserver

目标机上运行:

$ ~/local/gdb/bin/gdbserver :9000 cyclone --slave --start

Process cyclone created; pid = 10020

Listening on port 9000

或者 gdbserver ip:port --attach pid

在宿主机上运行 gdb

$ gdb

(gdb) set debug remote 1

(gdb) set architecture i386:x86-64

(gdb) target remote 192.168.103.232:9000

Remote debugging using 192.168.103.232:9000

warning: Could not load vsyscall page because no executable was specified

try using the "file" command first.

0x0000003422800b00 in ?? ()

Created trace state variable $trace_timestamp for target's variable 1.

(gdb) symbol-file ~/work/dev/g8m/build/debug/Gliese/home/bin/cyclone

Reading symbols from /home/kongds/work/dev/g8m/build/debug/Gliese/home/bin/cyclone...done.

(gdb) b main

Breakpoint 1 at 0x4cf177: file /home/kongds/work/dev/g8m/src/trunk/product/layer/GlieseTool/cyclone/dev/src/ztcm/ztcmMain.c, line 102.

(gdb) continue

Continuing.

Breakpoint 1, main (aArgc=3, aArgv=0x7fffa4b1e048)

at /home/kongds/work/dev/g8m/src/trunk/product/layer/GlieseTool/cyclone/dev/src/ztcm/ztcmMain.c:102

102 stlInt32 sState = 0;

(gdb) next

注意:remote 模式下,不支持 start 命令。因此需要先下断点,然后执行 c命令. 接着就能一步一步debug 了。

 

 

///////////////////////////////////////////////////

set debug remote 1

set architecture i386:x86-64

target remote 192.168.103.232:9000

symbol-file /home/fq/gbase8m/gbase8m_debug/dest/Gliese/home/bin/cyclone

set follow-fork-mode child

catch exec

在 VSCode 中通过 `gdbserver` 进行远程调试,需要配置调试器连接到运行在远程主机上的 `gdbserver` 实例。以下是详细的配置和操作步骤: ### 配置步骤 #### 1. 在远程主机上启动 `gdbserver` 确保远程主机上已安装 `gdbserver`,然后启动调试服务。例如: ```bash gdbserver localhost:1234 ./your_program ``` 上述命令将在 `localhost:1234` 上启动 `gdbserver` 并等待调试器连接,同时暂停程序执行在其入口点 [^1]。 #### 2. 在本地主机上配置 VSCode 的调试设置 在本地开发机上打开 VSCode,并为项目配置远程调试。编辑 `.vscode/launch.json` 文件,添加如下配置: ```json { "version": "0.2.0", "configurations": [ { "name": "GDB: Remote Debug", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/your_program", // 本地可执行文件路径 "args": [], "stopAtEntry": true, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "gdb", "miDebuggerPath": "/usr/bin/gdb", // 本地 gdb 路径 "miDebuggerServerAddress": "remote_host:1234", // 远程主机地址和端口 "debugServerPath": "/usr/bin/gdbserver", // 可选:远程 gdbserver 路径 "setupCommands": [ { "description": "Enable pretty-printing for gdb", "text": "-enable-pretty-printing", "ignoreFailures": true } ] } ] } ``` 确保将 `remote_host` 替换为远程主机的 IP 地址或主机名,例如 `192.168.0.106:1234` [^3]。 #### 3. 启动调试 在 VSCode 中按下 `F5` 或点击调试侧边栏中的“启动调试”按钮。此时,VSCode 将通过 `gdb` 连接到远程主机上的 `gdbserver`,并开始调试 [^2]。 #### 4. 解决架构不匹配问题(如 ARM 与 x86) 如果本地调试器与远程目标平台架构不一致(如本地为 x86,远程为 ARM),应使用 `gdb-multiarch` 替代标准 `gdb`: ```bash sudo apt install gdb-multiarch ``` 然后在 `launch.json` 中指定: ```json "miDebuggerPath": "/usr/bin/gdb-multiarch" ``` 这样可以避免因架构不匹配导致的错误,如 `Truncated register 37 in remote 'g' packet` [^5]。 ### 调试操作 一旦连接成功,可以在 VSCode 中使用标准调试功能: - 设置断点 - 单步执行 - 查看变量值 - 继续执行(F5) - 停止调试 ### 示例:使用命令行手动连接 你也可以在本地使用命令行手动连接,以验证配置是否正确: ```bash gdb-multiarch ./your_program (gdb) target remote remote_host:1234 ``` 这将连接到远程调试服务并开始调试 [^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值