嵌入式调试

运行PX4的自驾仪支持通过GDB或者LLDB的调试。

以下命令会列出最大静态内存分配的程序:

这个NSH命令提供了剩余的空闲内存:

    top命令显示出每个应用的栈使用量:

    1. top

    动态堆分配可以在符合POSIX系统上的SITL追踪得到 用的是 。

    安装指导

    Ubuntu:
    1. sudo apt-get install google-perftools libgoogle-perftools-dev

    启动堆分析

    首先,用如下指令编译固件:

    启动 jmavsim仿真:./Tools/jmavsim_run.sh

    在另一个中断,输入:

    1. cd build/posix_sitl_default/tmp
    2. export HEAPPROFILE=/tmp/heapprofile.hprof
    Fedora:
    1. env LD_PRELOAD=/lib64/libtcmalloc.so ../src/firmware/posix/px4 ../../posix-configs/SITL/init/lpe/iris
    2. pprof --pdf ../src/firmware/posix/px4 /tmp/heapprofile.hprof.0001.heap > heap.pdf
    Ubuntu:
    1. env LD_PRELOAD=/usr/lib/libtcmalloc.so ../src/firmware/posix/px4 ../../posix-configs/SITL/init/lpe/iris
    2. 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.
    1. arm-none-eabi-gdb build/px4fmu-v2_default/src/firmware/nuttx/firmware_nuttx

    然后在GDB提示符中,从R8中的最后一个指令开始,用闪存中的第一个地址(可识别,因为它以0x080开头,第一个为0x0808439f)。执行是从左到右。 所以在硬错误之前的最后一步是在试图发布一些东西,

    1. (gdb) info line *0x0808439f
    2. Line 77 of "../src/modules/systemlib/mavlink_log.c" starts at address 0x8084398 <mavlink_vasprintf+36>
    3. and ends at 0x80843a0 <mavlink_vasprintf+44>.
    1. (gdb) info line *0x08087c4e
    2. Line 311 of "../src/modules/uORB/uORBDevices_nuttx.cpp"
    3. and ends at 0x8087c52 <uORB::DeviceNode::publish(orb_metadata const*, void*, void const*)+6>.