前言
什么时候需要有
gdbserver
?远程调试生产环境; 生产环境没有调试环境, 本地才有;
大佬远程调试有编译环境的环境; 不过这种很少;
被调试程序执行环境不支持gdb
的特性; 或者环境不允许, 比如生产环境不好复现环境;
gdbserver
能执行的一般也可以执行gdb
, 一般都是操作系统, 只是不方便搭建环境而已, 或者不支持全部gdb
特性;
C/S
模式; 环境复现;
gdb
需要复现gdbserver
所在的执行环境; 也就是说需要一模一样;exe
和其依赖的共享库都需要本地存在, 一模一样, 即ldd
查看并打包下载;
为什么需要一模一样? 共享库地址空间等都需要一样? 不然地址空间有差异;传输协议
有线串口和网络
tcp/ip
; 明文协议, 不建议上公网;
连接
简介
怎么连: 连接类型和类型之间的差异;
调试环境搭建: 符号信息,源代码,可执行文件,共享库, 连接和断开的指令;连接类型
target remote ; target extended-remote
两种; 一种是普通版; 一种是加强版; 加强版略, 仅介绍普通版本;指令; extended-remote类型可自行查看;
- 指定调试程序:
gdb /path/to/file | gdb -ex 'file /path/to/file'
, 需要和gdbserver
一致,且一般是带符号的;gdbserver connect_addr file | gdbserver connect_addr --attach pid
;- 程序和正在执行的差异:
gdb
不支持attach
,gdbserver
支持选中;gdbserver CA file
第一条指令暂停;gdbserver CA --attach pid
可中止并加断点;- 连接:
gdb
执行target remote connect_addr
;connect_addr
对应gdbserver connect_addr ...
中的connect_addr
监听端口;- 执行:
run
普通模式不支持;- 退出:
gdb exit
之后gdbserver
一起死亡;while 1
会被杀死; 具体什么信号杀死的, 可自行测试;
连接
target remote host:port target remote [host]:port target remote tcp:host:port target remote tcp:[host]:port target remote tcp4:host:port target remote tcp6:host:port target remote tcp6:[host]:port
target remote udp:host:port target remote udp:[host]:port target remote udp4:host:port target remote udp6:[host]:port
案例
ch@vm:~/code/cfile/gdbserver$ ls test.cpp ch@vm:~/code/cfile/gdbserver$ cat test.cpp int main() { while(1); }ch@vm:~/code/cfile/gdbserver$ ch@vm:~/code/cfile/gdbserver$ g++ test.cpp -g ch@vm:~/code/cfile/gdbserver$ scp a.out 192.168.1.20:/home/ch/ch/cfile/test a.out 100% 9032 3.5MB/s 00:00 ch@vm:~/code/cfile/gdbserver$ gdb -q a.out Reading symbols from a.out...done. (gdb) target remote 192.168.1.20:8080 Remote debugging using 192.168.1.20:8080 warning: while parsing target description (at line 68): Vector "v8bf16" references undefined type "bfloat16" warning: Could not load XML target description; ignoring Reading /lib64/ld-linux-x86-64.so.2 from remote target... warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead. Reading /lib64/ld-linux-x86-64.so.2 from remote target... Reading symbols from target:/lib64/ld-linux-x86-64.so.2...Reading /lib64/ef896a699bb1c2e4e231642b2e1688b2f1a61e.debug from remote target... Reading /lib64/.debug/ef896a699bb1c2e4e231642b2e1688b2f1a61e.debug from remote target... (no debugging symbols found)...done. 0x00007ffff7fe32b0 in ?? () from target:/lib64/ld-linux-x86-64.so.2 (gdb) b main Breakpoint 1 at 0x5555554005fe: file test.cpp, line 2. (gdb) c Continuing. Reading /lib/x86_64-linux-gnu/libc.so.6 from remote target... BFD: warning: target:/lib/x86_64-linux-gnu/libc.so.6: unsupported GNU_PROPERTY_TYPE (5) type: 0xc0008002 Reading /lib/x86_64-linux-gnu/389d485a9793dbe873f0ea2c93e02efaa9aa3d.debug from remote target... Reading /lib/x86_64-linux-gnu/.debug/389d485a9793dbe873f0ea2c93e02efaa9aa3d.debug from remote target... Breakpoint 1, main () at test.cpp:2 2 while(1); (gdb) q A debugging session is active. Inferior 1 [process 211830] will be killed. Quit anyway? (y or n) y ch@vm:~/code/cfile/gdbserver$
ch@ch:~/ch/cfile/test$ ls ch@ch:~/ch/cfile/test$ pwd /home/ch/ch/cfile/test ch@ch:~/ch/cfile/test$ gdbserver 0:8080 a.out Process /home/ch/ch/cfile/test/a.out created; pid = 211830 Listening on port 8080 Remote debugging from host 192.168.1.74, port 53562 ch@ch:~/ch/cfile/test$
可以看到是一次性连接;