| name | bsp-debugging |
| description | Debugging techniques for BeagleBone BSP. Covers kernel crash analysis (oops/panic), JTAG/GDB, serial console, dynamic debug, FreeRTOS task inspection, U-Boot debug, and Yocto build issue diagnosis. |
| origin | custom-bsp |
BSP Debugging Guide — BeagleBone Black
Systematic debugging techniques for all layers of the BSP stack.
Serial Console (First Line of Defense)
picocom -b 115200 /dev/ttyUSB0
minicom -D /dev/ttyUSB0 -b 115200
Kernel Debugging
Dynamic Debug (printk)
echo "module my_driver +p" > /sys/kernel/debug/dynamic_debug/control
echo "file drivers/misc/my_driver.c +p" > /sys/kernel/debug/dynamic_debug/control
dev_dbg(&dev->dev, "register val: 0x%08x\n", val); // activated by dynamic_debug
pr_debug("module level debug: %d\n", val);
Kernel Oops Analysis
# Typical oops format — read this:
Unable to handle kernel NULL pointer dereference at virtual address 00000000
PC is at my_irq_handler+0x24/0x80 [my_driver]
LR is at __irq_enter_raw+0x10/0x20
# Decode with addr2line:
arm-linux-gnueabihf-addr2line -e vmlinux -s 0xc0<address>
# Or use faddr2line script:
scripts/faddr2line vmlinux my_irq_handler+0x24/0x80
DebugFS Inspection
mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/pinctrl/44e10800.pinmux/pins
cat /sys/kernel/debug/pinctrl/44e10800.pinmux/pingroups
cat /sys/kernel/debug/clk/clk_summary
cat /sys/kernel/debug/regmap/*/registers
Driver & Device Inspection
lsmod | grep my_driver
dmesg | grep my_driver
ls -la /sys/bus/platform/drivers/my_driver/
cat /sys/bus/platform/devices/48300000.my_device/uevent
gpioinfo
gpioget gpiochip0 14
i2cdetect -y 1
spidev_test -D /dev/spidev0.0 -v
U-Boot Debugging
printenv
printenv bootargs
md.l 0x44e07000 0x10
mw.l 0x44e07000 0x7FF
fdt addr ${fdtaddr}
fdt print /
load mmc 0:2 ${loadaddr} /boot/zImage
load mmc 0:2 ${fdtaddr} /boot/am335x-boneblack-custom.dtb
bootz ${loadaddr} - ${fdtaddr}
FreeRTOS Debugging
Task State Inspection
char task_buf[512];
vTaskList(task_buf);
printf("Task Name\tState\tPrio\tStack\tNum\r\n");
printf("%s\r\n", task_buf);
char stats_buf[512];
vTaskGetRunTimeStats(stats_buf);
printf("%s\r\n", stats_buf);
Stack Overflow Detection
#define configCHECK_FOR_STACK_OVERFLOW 2
#define configUSE_MALLOC_FAILED_HOOK 1
#define configUSE_TRACE_FACILITY 1
#define configGENERATE_RUN_TIME_STATS 1
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)
{
printf("STACK OVERFLOW in task: %s\r\n", pcTaskName);
taskDISABLE_INTERRUPTS();
for (;;);
}
FreeRTOS on QEMU (lm3s6965evb — Stellaris Cortex-M3)
qemu-system-arm -machine lm3s6965evb \
-kernel freertos/build/freertos.elf \
-serial mon:stdio \
-nographic
qemu-system-arm -machine lm3s6965evb \
-kernel freertos/build/freertos.elf \
-serial mon:stdio -nographic \
-S -gdb tcp::1234 &
arm-none-eabi-gdb freertos/build/freertos.elf
(gdb) target remote :1234
(gdb) break main
(gdb) continue
Yocto/BitBake Debugging
bitbake -v my_recipe
bitbake -c devshell my_recipe
bitbake -e my_recipe | grep "^VAR_NAME"
cat tmp/work/<arch>/my_recipe/*/temp/log.do_compile
bitbake -g my_recipe && cat pn-depends.dot | grep my_recipe
oe-pkgdata-util find-path /usr/lib/libmy.so
GDB Remote Debug
gdbserver :1234 ./my_app
arm-linux-gnueabihf-gdb ./my_app
(gdb) target remote <bbb_ip>:1234
(gdb) break main
(gdb) continue
arm-linux-gnueabihf-gdb vmlinux
(gdb) target remote /dev/ttyUSB0
Quick Checklist When Something Doesn't Work
1. Serial console → Any kernel errors/oops?
2. dmesg | grep -i error → Error messages from driver?
3. ls /sys/bus/platform/devices/ → Device detected by kernel?
4. cat /sys/bus/platform/drivers/ → Driver loaded?
5. /sys/kernel/debug/pinctrl → Pins configured correctly?
6. /sys/kernel/debug/clk → Required clocks enabled?
7. i2cdetect / spidev_test → Hardware responding?
8. dmesg | grep <driver_name> → Probe success/fail?