前段时间,arm下业务软件莫名其妙的挂死,然而挂死时间和时机均属于不确定因素,测试发现挂死几率并不高,有时一天两天都不会出现,有时半小时、一小时就挂死,晕死,经过排查和现象推断极有可能是内存访问或操作异常导致,好吧,查代码并无明显异常访问、操作迹象,如何是好???唉,只能求助于第三方内存查看软件喽!!
1.Valgrind,我的第一选择
Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具,想必大家不陌生吧!我们先看下交叉编译过程:
A、官网下载valgrind,下载网址:http://valgrind.org/downloads/current.html#current;
B、解压并进入解压目录,修改configure:"armv7*)" ---->"armv7*|arm*)"
C、执行./configure --host=arm-linux --prefix=/usr/arm_valgrind --program-prefix=arm-linux,
注释:--host指示指定软件运行的系统平台,一般要与交叉编译器程序的前缀。
--program-prefix=PREFIX 指定将被加到所安装程序的名字上的前缀。
D、执行make,报错为:bad value(cortex-a8) for -mcpu=switch,我的arm版本cortex-a8 ,,说明valgrind不支持该arm版本,查过资料valgrind好像不支持arm7以上,暂不知啥原因。
结果表明valgrind不适用当前编译环境-----cortex-a8。
2.gdb+gdbServer远程调试环境搭建
A、GDB的源代码包下载 http://www.gnu.org/software/gdb/download/ 下载
B、编译gdb,gdb运行在host主机上,一般是pc机端,解压并进入解压目录,执行./configure --target=arm-linux --prefix=/usr/arm_gdb --program-prefix=arm-linux,
注释:--target配置gdb的目标平台,--prefix配置安装路径gdb/gdbservergdbserver目录下生成gdbserver可执行文件,更改其属性,使用任何人都可以读写执行。C、make
D、make install
E、编译gdbServer,使用交叉编译器,该软件运行于arm目标板端。
执行cd gdb/gdbserver
执行配置
./configure --target=arm-linux --host=arm-linux
编译
make CC=arm-linux-gcc //指定交叉编译器,最好使用绝对路径,否则需设置环境变量
F、调试使用。目标板ip:192.168.1.105,host ip:192.168.1.100。
在目标板上执行命令: /mnt/flash/gdbserver 192.168.1.100:5566 调试程序名称
host端运行:arm-linux-gdb 调试程序名称
然后输入gdb命令:target remote 192.168.1.105:5566即可看到相应提示信息。
注意:调试程序名称要保持一致,即目标板和host端都在调试程序所在目录下执行相应命令。
哦,最后告诉大家,arm下业务软件莫名其妙的挂死原因并非内存访问、操作异常导致,最终查明是线程同步过程中导致异常。最终拨开乌云见日明啊!!