Linux-Arm GDB调试(本地和远程)

目录

问题描述

已有coredump

没有coredump

小结


问题描述

Linux本机调试使用GDB非常方便,但嵌入式Linux设备资源有限,通常并没有交叉编译工具,那嵌入式设备上的应用发生问题如何查找问题?通常IDE有远程DEBUG功能,这种能快速定位固定且容易复现的错误。那么不定期发生,且位置不固定的Bug可能就要用到GDB了。

已有coredump

这种情况是app发生了crash,大多原因是非法访问内存,这个时候很容易能查到设备发生崩溃时,最后调用的堆栈,然后沿着前后调用查找问题即可,首先要开启linux设备的coredump功能:

  • 是否需要根据应用程序不同的pid生成不同的coredump文件,0为不需要,主要考虑是空间问题。

    echo 0 > /proc/sys/kernel/core_uses_pid

  • 将生成的coredump文件重定向到自己的文件夹,方便查找。

    echo home/app/log/coredump > /proc/sys/kernel/core_pattern

  • 崩溃时生成无限制大小的coredump文件。

    ulimit -c unlimited

  • 接下来将发生问题的app和coredump文件放入linux环境中。

  • 找到对应的交叉编译工具链,使用其进行调试。

    sudo ./usr/local/oecore-x86_64/sysroots/x86_64-angstromsdk-linux/usr/bin/arm-angstrom-linux-gnueabi/arm-angstrom-linux-gnueabi-gdb app coredump

最终定位到问题所在。

没有coredump

个别情况下,并没有发生crash,但是程序卡死或者无响应,这个时候并不会生成coredump文件,那么就需要进行远程在线调试。

  • 首先在设备端开启gdbserver服务

  • 填入虚拟机Linux的IP和监听的端口

  • 填入正在发生问题的应用进程,比如此处的561

    gdbserver --attach 192.168.22.149:21 561

  • 虚拟机linux端,则先打开gdb调试器:

    sudo ./arm-angstrom-linux-gnueabi-gdb

  • 然后在调试器命令行输入:

    target remote 192.168.22.1:21

  • gdb会读取当前进程的所有调用,并显示出卡死位置

  • 最后使用指令bt full定位问题原因

小结

随机性问题,问题一旦发生,保存现场十分重要,不知道何时才会复现,要基于当前的设备状态,尽可能的去追溯本次的问题,这样才能有效的解决问题。

相关推荐
Huangjin007_17 分钟前
【Linux 系统篇(一)】入门基础指令详解(一)
linux·服务器
嵌入式小能手18 分钟前
飞凌嵌入式ElfBoard-i2c与从设备通讯编程示例之i2c设备通信编程示例
linux
mounter62523 分钟前
现代 Linux 内核中的数据持久化艺术:从回写(Writeback)到多样化写策略
linux·linux kernel·kernel·writeback·writethrough
会飞的小新37 分钟前
《深入理解 DDR Memory Margin》系列之第一章:从 DDR 到 Memory Margin——为什么服务器需要进行内存裕量测试?
linux·服务器
治愈系贝壳44 分钟前
ARM ---day1
linux·arm开发·学习
汤愈韬1 小时前
KYCA运维认证
运维·服务器·网络
晚风吹长发1 小时前
探索软件测试——用例篇
大数据·linux·服务器·压力测试·测试·测试方法
ZENERGY-众壹1 小时前
50MW分布式VPP接入实战:调度中心要求的1分钟频率如何不卡死API
运维·服务器·分布式·光伏运维
CHANG_THE_WORLD1 小时前
Linux C 多线程 TCP 并发服务器:从 `accept()` 到资源管理深度剖析
linux·服务器·c语言
运维大师1 小时前
【Linux运维极简教程】10-日志管理与故障排查
linux·运维·服务器