参考网址(并表示感谢)
https://blog.csdn.net/weixin_30292843/article/details/95570685
https://blog.csdn.net/chenyitao736866376/article/details/98731228
https://blog.csdn.net/csq_year/article/details/78845684
**方法一:通过core文件来获取错误信息**
首先配置Core文件的生成环境
步骤一:
首先通过 ulimit –c
查看 若为0,则不会产生对应的coredump,需要进行修改和设置。
ulimit -c unlimited
(可以产生coredump且不受大小限制),这种设置仅对当前生效;
Tisp:如果想永久生效,在/etc/profile中加入以下一行,这将允许生成coredump文件
ulimit -c unlimited
步骤二:更改core dump生成路径
因为core dump默认会生成在程序的工作目录,但是有些程序存在切换目录的情况,导致core dump生成的路径没有规律,
所以最好是自己建立一个文件夹,存放生成的core文件。
我建立一个 mkdir ~/coredump
文件夹,在家目录里的coredump文件夹。
调用如下命令:
echo ~/coredump/core.%e.%p> /proc/sys/kernel/core_pattern
将更改core文件生成路径,自动放在这个~/coredump文件夹里。
测试是否能生成core文件
步骤一、制造错误
void MainWindow::c()
{
// 异常位置
int *i = NULL;
*i = 100;
}
步骤二、运行,得出错误信息
步骤三、测试core文件和调试
1、把arm板子里的core文件复制到ubuntu里
2、用gdb调试该core
由于我的交叉编译工具里面就有了gdb(大部分交叉编译工具都有带),所以我就直接用,也不用自己去交叉编译一个gdb,楼主之前尝试过,失败了!
由于大多数人都遇到打开gdb后,调试时出现问号这种情况。
出现原因和解决方法,这个博主写得很清楚:
https://blog.csdn.net/weixin_30292843/article/details/95570685
调试方法如下所示:
执行命令的格式:
gdb 可执行程序exe
(就是之前在板子上奔溃的程序)
进入gdb环境后
core-file core的名字
(从板子上复制出来的core文件)
**方法二:gdb+gdbserver实现远程调试**
配置gdb+gdbserver
一、由于官方已经提供了交叉编译工具包里面已经提供了gdb,所以我这里就直接用
arm-poky-linux-gnueabi-gdb
(如果需要自个交叉编译gdb,推荐网站:
https://blog.csdn.net/edwardlulinux/article/details/8070224
)
可下载:gdb-7.2a.tar.gz、gdb-7.4.1.tar.gz、gdb-7.10.1.tar.gz源码包
链接:https://pan.baidu.com/s/1SgDe_Yv4jvd_qsCMleHVfA
提取码:dymc
复制这段内容后打开百度网盘手机App,操作更方便哦
二、编译gdbserver
(如果有跟我情况一样的小伙伴们,在下载gdb包前先查看一下自个用的gdb版本号)
1、查看GDB版本号;
arm-poky-linux-gnueabi-gdb --version
GNU gdb (GDB) 7.10.1 | 用的是7.10.1 版本的源码包 |
---|---|
–host=x86_64-pokysdk-linux | 指定了编译后的程序需要在x86运行 |
–target=arm-poky-linux-gnueabi | 该参数的目的是让配置程序知道,这个软件被编译后,用于处理什么平台上的文件的。所以说这个GDB是用于处理arm平台上的文件 |
2、解压下载的GDB源码包
tar xvf gdb-7.10.1.tar.gz
cd gdb-7.10.1/
3、编译
进入gdbserver文件下编译
cd /home/gec/m_gdb/gdb-7.10.1/gdb/gdbserver
编译配置
./configure --target=arm-poky-linux-gnueabi --prefix=/opt/gdbserver/ --host=arm-poky-linux-gnueabi
编译
make & make install
结果:
编译过程可能遇到的问题:
- 错误问题1:
In file included from ./common/common-defs.h:46:0,
from defs.h:28,
from linux-tdep.c:20: linux-tdep.c: In function ‘linux_core_info_proc_mappings’: ./common/gdb_assert.h:26:14: error:
size of array ‘never_defined_just_used_for_checking’ is negative
extern int never_defined_just_used_for_checking[(expr) ? 1 : -1]
linux-tdep.c:984:3: note: in expansion of macro ‘gdb_static_assert’ gdb_static_assert (sizeof (ULONGEST) >= 8);
解决方法:
不是到/m_gdb/gdb-7.10.1下配置,而是在/m_gdb/gdb-7.10.1/gdb/gdbserver文件下配置
测试
把 生成的gdbserver工具复制到arm板上
arm-poky-linux-gnueabi-gdbserver
1、在arm板上通过gdbserver工具,执行错误应用程序 wifierro:
./arm-poky-linux-gnueabi-gdbserver 192.168.1.80:5555 wifierro
2、在虚拟机ubuntu上执行gdb工具
arm-poky-linux-gnueabi-gdb ./wifierro
进入gdb后连接
(gdb) target remote 192.168.1.80:5555
可能遇到了大多数人都会遇到的问题
gdb调试时重要的函数名是问号
解决方法:
Reading /lib/.debug/ld-2.23.so from remote target…
(no debugging symbols found)…done.
----------------》说明这个库没有找到
我们先不要慌
继续按C允许程序
(gdb) c
这时GDB告诉我们需要设置一下环境:
(dfb) set solib-search-path /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/
/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/ 是通过寻找 /lib/.debug/ld-2.23.so ,找到这库的路径就可以解决GDB出现问号的问题
寻找/lib/.debug/ld-2.23.so
find / -name ld-2.23.so
提示:如果多个路径,就多尝试,总有一个路径的正确的