(1)将交叉编译工具下的gdbserver拷到arm板上,我默认gdbserver在交叉编译工具下的路径为arm-arago-linux-gnueabi/usr/bin,其中gdbserver是arm的可执行程序。
/usr/cgt_a8/arago/linux-devkit/arm-arago-linux-gnueabi/usr/bin/gdbserver:
ELF 32-bit LSB executable, ARM,
EABI5 version 1 (SYSV), dynamically linked (uses shared libs),
for GNU/Linux 2.6.16, stripped
(2)用arm-gcc交叉编译一个测试程序,helloworld
arm-arago-linux-gnueabi-gcc helloworld.c -O0 -Wall -g2 -o hello
(3)拷贝helloworld到arm开发板上,在宿主的x86 linux机器上也留一份,以备调试。
(4)在开发板启动gdbserver,命令格式为./gdbserver [arm开发板ip]:[任意非周知口] ./待调试程序
以hello为例:
./gdbserver 192.168.1.9:6666 ./hello
其中192.168.1.9是我的arm开发板ip,6666是我随便启动的端口,hello是我第(2)步编的程序。
(5)在宿主的x86 linux机器上,启动arm-gdb,命令为:
arm-arago-linux-gnueabi-gdb ./hello
其中,(4)、(5)步启动的是同一个hello程序,不过是分别拷到了arm开发板和x86 linux宿主机。
(6)在宿主的x86 linux机器,在gdb的运行环境中指定目标arm板卡:
(gdb) target remote 192.168.1.9:6666
(7)在宿主的x86 linux机器上,设置断点b main,然后按c或者n开始调试,注意这里不能直接按r,r之后会出现报错
“ Cannot find bounds of current function”。
补充记录:
(1)由于我采用的arm芯片比较老,是32位的arm,所以在x86 64位机器上进行交叉编译时,会提示缺少“libpython2.6.so.1.0”库,网上给的重新编译python的方法,编译出来也是64位的,还得下32位的x86的编译环境,费事费力,我采用的方法是直接更新python的开发库,方法为:
apt-get update
apt-get upgrade
apt-get install python:i386
apt-get install python-gdbm:i386
apt-get install libgv-python:i386
在/usr/lib/i386-linux-gnu,会出现相应的库.so,如果版本是2.7的,改名或链接成2.6就行。
(2)我系统的编译文件是cmake做的,cmake中编译调试版本的方法是:
cmake_minimum_required(VERSION 2.8)
...#arm的交叉编译设定
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
project(alsatest)
...#工程编译文件
其中,中间的那3条SET,就是设定编译为调试版本。