嵌入式调试
运行PX4的自驾仪支持通过GDB或者LLDB的调试。
以下命令会列出最大静态内存分配的程序:
这个NSH命令提供了剩余的空闲内存:
top命令显示出每个应用的栈使用量:
top
动态堆分配可以在符合POSIX系统上的SITL追踪得到 用的是 。
安装指导
Ubuntu:
sudo apt-get install google-perftools libgoogle-perftools-dev
启动堆分析
首先,用如下指令编译固件:
启动 jmavsim仿真:./Tools/jmavsim_run.sh
在另一个中断,输入:
cd build/posix_sitl_default/tmp
export HEAPPROFILE=/tmp/heapprofile.hprof
Fedora:
env LD_PRELOAD=/lib64/libtcmalloc.so ../src/firmware/posix/px4 ../../posix-configs/SITL/init/lpe/iris
pprof --pdf ../src/firmware/posix/px4 /tmp/heapprofile.hprof.0001.heap > heap.pdf
Ubuntu:
env LD_PRELOAD=/usr/lib/libtcmalloc.so ../src/firmware/posix/px4 ../../posix-configs/SITL/init/lpe/iris
google-pprof --pdf ../src/firmware/posix/px4 /tmp/heapprofile.hprof.0001.heap > heap.pdf
这将生成一个具有堆分配图的PDF。
图中的数字全部为零,因为它们以MB为单位。 我们只需要看百分比。 它们显示实时内存(节点和子树),意味着最后仍在使用的内存。
有关详细信息,请参阅文档。
硬故障(hard fault)是这样一种状态:操作系统检测到没有有效的指令执行。 通常情况下,这是因为RAM中的关键区域已损坏。 典型的情况是:不正确内存获取破坏了堆栈,并且处理器发现内存中的地址不是微处理器RAM的有效地址。
- 栈向下生长。所以以下例子的最高地址是 0x20021060, 大小是 0x11f4 (4596 bytes), 因此最低地址是 0x2001fe6c.
arm-none-eabi-gdb build/px4fmu-v2_default/src/firmware/nuttx/firmware_nuttx
然后在GDB提示符中,从R8中的最后一个指令开始,用闪存中的第一个地址(可识别,因为它以0x080开头,第一个为0x0808439f)。执行是从左到右。 所以在硬错误之前的最后一步是在试图发布一些东西,
(gdb) info line *0x0808439f
Line 77 of "../src/modules/systemlib/mavlink_log.c" starts at address 0x8084398 <mavlink_vasprintf+36>
and ends at 0x80843a0 <mavlink_vasprintf+44>.
(gdb) info line *0x08087c4e
Line 311 of "../src/modules/uORB/uORBDevices_nuttx.cpp"
and ends at 0x8087c52 <uORB::DeviceNode::publish(orb_metadata const*, void*, void const*)+6>.