1.在应用程序运行平台中,打开dump功能(如果没有ulimit):
busybox sh -c 'ulimit -a'
ulimit -c unlimited
2.将应用程序编译,开启调试信息:
在makefile的cflags中: -g
3.
当程序出现段错误时,会将dumped文件输出到你运行程序的目录下。比如说,你是在tmp下,运行程序,那么dumped文件就会在tmp目录下
调试示例:
我的dumped文件名是:iot_wrt.13460.11.1569210595.core
程序名是:iot_wrt
- 进入调试:
mipsel-openwrt-linux-gdb iot_wrt iot_wrt. iot_wrt.13460.11.1569210595.core
进入后:输入命令:bt,这是进入最终段错误的地方
由以上可知:
出现这个东西:
出现#3出现了??(),阻碍了我们查看这个信息是什么,这是因为库没有找到相关的库符号表导致,上面也提示了,有12库没有加载成功,可以通过命令set solib-search-path libpath
加载到,那么找到你库的防止路径:
2)加载库
命令:
Set solib-search-path /home/liuy/workplace/wang_dev/openwrt_mt7688/openwrt-sdk/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/lib:/home/liuy/workplace/wang_dev/openwrt_mt7688/iot_gw/src/daemons/wrt_app/wrt_lib/lib
再次进入:
bt应该就可以了,如果还是有??,那么库没有找成功,或者你这个应该程序的库对应不上
,查看调用关系:
是从3->2->1->0,所以是0这个对应的函数出现问题导致段错误的。
有些可以指明是哪一行,但是我这里没有,只是指明了是哪一个函数里面出现问题的,现在我们就能功能函数详细的看看,哪里出现问题了。
3)如果没法确定是哪个的话,还可以通过反汇编方式找到:
mipsel-openwrt-linux-objdump -d iot_wrt.13460.11.1569210595.core >iot_wrt.S
如下:
这个只能说是应用程序本身出现了问题,如果是库出现了,那么只能反汇编库看看了。根据地址找到汇编的代码出。