1 概述
在嵌入式开发中,对程序调试,这时就会用到gdbserver。gdbserver与gdb需要搭配使用,gdbserver是服务端,作为服务运行在开发板上;gdb是客户端运行在主机端。本文简单讲下利用gdbserver通过网络调试开发板上程序。gdbserver其实也支持通过串口调试,本文不做描述。
2 开发板端
2.1 启动gdbserver
在开发板命令行运行如下命令,启动gdbserver:
# ./gdbserver 192.168.1.221 sdktest
Process sdktest created; pid = 161
Listening on port 6000
gdbserver运行程序sdktest,在端口6000等待gdb连接。
3 主机端
3.1 启动gdb
主机运行命令gdb,并连接gdbserver:
$ arm-xilinx-linux-gnueabi-gdb -ex "target remote 192.168.1.221:6000"
Remote debugging using 192.168.1.221:6000
0xb6fd7ac0 in ?? ()
(gdb)
开发板命令行会显示类似下面信息,说明有gdb连接:
Remote debugging from host 192.168.1.50
3.2 加载文件
运行file加载可执行文件sdktest:
(gdb) file sdktest
A program is being debugged already.
Are you sure you want to change the file? (y or n) y
Reading symbols from sdktest...done.
(gdb)
3.3 显示源码
(gdb) list
9 else \
10 { \
11 std::cout << #fun << " is fail!" << std::endl; \
12 return -1; \
13 }
14
15 namespace xy = xxx::yyy::v1;
16 int main(int argc, char *argv[])
17 {
18 xy::Transceiver transceiver;
(gdb)
3.4 设置断点
(gdb) b 18
Breakpoint 1 at 0x8bdc: file /home/james/git/test/apps/sdktest/sdktest.cpp, line 18.
(gdb)
在18行设置断点。
3.5 运行
(gdb) c
Continuing.
Breakpoint 1, main (argc=1, argv=0xbefffdd4) at /home/james/git/test/apps/sdktest/sdktest.cpp:18
18 xy::Transceiver transceiver;
(gdb)
在18行设置一个断点,运行停到了18行。
3.6 单步执行
(gdb) n
19 xy::Info::PrintSDKVersion();
(gdb)
3.7 查看调用栈
(gdb) bt
#0 main (argc=1, argv=0xbefffdd4) at /home/james/git/test/apps/sdktest/sdktest.cpp:19
(gdb)
3.8 继续执行
(gdb) c
Continuing.
[Inferior 1 (process 170) exited normally]
(gdb)
只设置了一个断点,继续执行到程序结束。