Qt自带调试功能,如果是主机上的程序可以直接调试,非常方便。同时,Qt是一个跨平台的编程语言,在主机上调试其他平台上的程序时就需要相应的设置。这种跨平台的调试在嵌入式开发时尤为重要,这里对跨平台的Qt调试作一个简单的介绍。
1.环境:
- 主机UBUNTU12.04,Qt Creator3.6.1,IP地址192.168.199.249,编译器版本:gcc 4.6.3,交叉编译器版本:arm-linux-gcc 3.4.5
- 开发板
#uname -a
Linux (none) 2.6.24 #24 Sun Jul 10 13:10:31 CST 2011 armv5tejl unknown
IP地址192.168.199.99
2.编译调试器
1. 主机端调试器
- 下载调试器源码GDB: The GNU Project Debugger,我这里下载的是gdb-7.6.tar.gz。
- 解压缩
tar zxvf gdb-7.6.tar.gz
- 进入工作目录
cd gdb-7.6
- 配置
./configure --target=arm-linux --prefix=/home/yy/ctools/arm-9261 -v
make
make install
这时
arm-linux-gdb
和
arm-linux-run
就安装到了
/home/yy/ctools/arm-9261/bin
目录下了。
2.编译开发板端调试器
- 进入gdbserver的目录
cd gdb/gdbserver
- 编译
make
编译过程中出了一点小问题,没有定义
PTRACE_GETSIGINFO
linux-arm-low.c:643: error: `PTRACE_GETSIGINFO' undeclared (first use in this function)
解决方法参考
应用调试之使用gdb和gdbserver
这里提示没有PTRACE_GETSIGINFO
这个东西,这里搜索PTRACE_GETSIGINFO
的路径为-I指定的头文件以及交叉编译工具链,我们不妨到交叉编译工具链里面去查找一下:
cd /usr/local/arm/3.4.5/
grep "PTRACE_GETSIGINFO" * -nR
找到如下信息:
arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO 0x4202
arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO 0x4202
distributed/arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO 0x4202
distributed/arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO 0x4202
说明PTRACE_GETSIGINFO
是在交叉编译工具链:linux/ptrace.h
文件里定义的,那么可能是头文件没有包含好吧!
我们到gdbserver下的linux-arm-low.c
里面一看,可不是嘛,只有:#include
而没有:#include
,于是加上:#include
,再次编译:make CC=/usr/local/arm/3.4.5/bin/arm-linux-gcc
,成功!
重新编译就好了,这时在当前文件夹下就可以看到
gdbserver
文件了。
3.测试
1. 设置开发板端
将编译好的文件和gdbserver拷贝到开发板上,执行
./gdbserver 192.168.199.249:1234 filename
其中IP是主机的IP地址。
显示,说明gdbserver已经在运行了。
process filename created; pid = 319
Listening on port 1234
2. 设置主机端Qt Creator
进入
调试-->开始调试-->Attach To Running Debug Server
端口号是上一步骤中设置的端口号;
Override server address
是开发板的IP地址;本地执行档是程序的二进制文件,要和开发板中执行的一致;开发套件中的调试器要选择上面编译好的arm-linux-gdb;
点击OK就可以在主机上调试开发板中的程序了。