Browse Source

Jenkins attach GDB and print back trace on failure

master
Daniel Agar 3 years ago
parent
commit
17328bef69
  1. 94
      .ci/Jenkinsfile-hardware
  2. 41
      platforms/nuttx/Debug/jlink_gdb_backtrace.sh
  3. 12
      platforms/nuttx/cmake/jlink.cmake

94
.ci/Jenkinsfile-hardware

@ -21,7 +21,7 @@ pipeline {
sh 'make cubepilot_cubeorange_test' sh 'make cubepilot_cubeorange_test'
sh 'make cubepilot_cubeorange_test bootloader_elf' sh 'make cubepilot_cubeorange_test bootloader_elf'
sh 'ccache -s' sh 'ccache -s'
stash includes: 'build/*/*.elf, platforms/nuttx/Debug/upload_jlink_gdb.sh, Tools/HIL/*.py', name: 'cubepilot_cubeorange_test' stash includes: 'build/*/*.elf, platforms/nuttx/Debug/*, Tools/HIL/*.py', name: 'cubepilot_cubeorange_test'
} }
post { post {
always { always {
@ -70,6 +70,7 @@ pipeline {
} }
post { post {
always { always {
sh './platforms/nuttx/Debug/jlink_gdb_backtrace.sh build/cubepilot_cubeorange_test/cubepilot_cubeorange_test.elf || true'
resetBoard() resetBoard()
} }
} }
@ -91,7 +92,7 @@ pipeline {
sh 'make cuav_x7pro_test' sh 'make cuav_x7pro_test'
sh 'make cuav_x7pro_test bootloader_elf' sh 'make cuav_x7pro_test bootloader_elf'
sh 'ccache -s' sh 'ccache -s'
stash includes: 'build/*/*.elf, platforms/nuttx/Debug/upload_jlink_gdb.sh, Tools/HIL/*.py', name: 'cuav_x7pro_test' stash includes: 'build/*/*.elf, platforms/nuttx/Debug/*, Tools/HIL/*.py', name: 'cuav_x7pro_test'
} }
post { post {
always { always {
@ -138,6 +139,7 @@ pipeline {
} }
post { post {
always { always {
sh './platforms/nuttx/Debug/jlink_gdb_backtrace.sh build/cuav_x7pro_test/cuav_x7pro_test.elf || true'
resetBoard() resetBoard()
} }
} }
@ -159,7 +161,7 @@ pipeline {
sh 'make px4_fmu-v3_test' sh 'make px4_fmu-v3_test'
sh 'make px4_fmu-v3_test bootloader_elf' sh 'make px4_fmu-v3_test bootloader_elf'
sh 'ccache -s' sh 'ccache -s'
stash includes: 'build/*/*.elf, platforms/nuttx/Debug/upload_jlink_gdb.sh, Tools/HIL/*.py', name: 'px4_fmu-v3_test' stash includes: 'build/*/*.elf, platforms/nuttx/Debug/*, Tools/HIL/*.py', name: 'px4_fmu-v3_test'
} }
post { post {
always { always {
@ -206,6 +208,7 @@ pipeline {
} }
post { post {
always { always {
sh './platforms/nuttx/Debug/jlink_gdb_backtrace.sh build/px4_fmu-v3_test/px4_fmu-v3_test.elf || true'
resetBoard() resetBoard()
} }
} }
@ -227,7 +230,7 @@ pipeline {
sh 'make px4_fmu-v4_test' sh 'make px4_fmu-v4_test'
sh 'make px4_fmu-v4_test bootloader_elf' sh 'make px4_fmu-v4_test bootloader_elf'
sh 'ccache -s' sh 'ccache -s'
stash includes: 'build/*/*.elf, platforms/nuttx/Debug/upload_jlink_gdb.sh, Tools/HIL/*.py', name: 'px4_fmu-v4_test' stash includes: 'build/*/*.elf, platforms/nuttx/Debug/*, Tools/HIL/*.py', name: 'px4_fmu-v4_test'
} }
post { post {
always { always {
@ -273,6 +276,7 @@ pipeline {
} }
post { post {
always { always {
sh './platforms/nuttx/Debug/jlink_gdb_backtrace.sh build/px4_fmu-v4_test/px4_fmu-v4_test.elf || true'
resetBoard() resetBoard()
} }
} }
@ -294,7 +298,7 @@ pipeline {
sh 'make px4_fmu-v4pro_test' sh 'make px4_fmu-v4pro_test'
sh 'make px4_fmu-v4pro_test bootloader_elf' sh 'make px4_fmu-v4pro_test bootloader_elf'
sh 'ccache -s' sh 'ccache -s'
stash includes: 'build/*/*.elf, platforms/nuttx/Debug/upload_jlink_gdb.sh, Tools/HIL/*.py', name: 'px4_fmu-v4pro_test' stash includes: 'build/*/*.elf, platforms/nuttx/Debug/*, Tools/HIL/*.py', name: 'px4_fmu-v4pro_test'
} }
post { post {
always { always {
@ -341,6 +345,7 @@ pipeline {
} }
post { post {
always { always {
sh './platforms/nuttx/Debug/jlink_gdb_backtrace.sh build/px4_fmu-v4pro_test/px4_fmu-v4pro_test.elf || true'
resetBoard() resetBoard()
} }
} }
@ -362,7 +367,7 @@ pipeline {
sh 'make px4_fmu-v5_debug' sh 'make px4_fmu-v5_debug'
sh 'make px4_fmu-v5_debug bootloader_elf' sh 'make px4_fmu-v5_debug bootloader_elf'
sh 'ccache -s' sh 'ccache -s'
stash includes: 'build/*/*.elf, platforms/nuttx/Debug/upload_jlink_gdb.sh, Tools/HIL/*.py', name: 'px4_fmu-v5_debug' stash includes: 'build/*/*.elf, platforms/nuttx/Debug/*, Tools/HIL/*.py', name: 'px4_fmu-v5_debug'
} }
post { post {
always { always {
@ -420,6 +425,7 @@ pipeline {
} }
post { post {
always { always {
sh './platforms/nuttx/Debug/jlink_gdb_backtrace.sh build/px4_fmu-v5_debug/px4_fmu-v5_debug.elf || true'
resetBoard() resetBoard()
} }
} }
@ -441,7 +447,7 @@ pipeline {
sh 'make px4_fmu-v5_stackcheck' sh 'make px4_fmu-v5_stackcheck'
sh 'make px4_fmu-v5_stackcheck bootloader_elf' sh 'make px4_fmu-v5_stackcheck bootloader_elf'
sh 'ccache -s' sh 'ccache -s'
stash includes: 'build/*/*.elf, platforms/nuttx/Debug/upload_jlink_gdb.sh, Tools/HIL/*.py', name: 'px4_fmu-v5_stackcheck' stash includes: 'build/*/*.elf, platforms/nuttx/Debug/*, Tools/HIL/*.py', name: 'px4_fmu-v5_stackcheck'
} }
post { post {
always { always {
@ -498,6 +504,7 @@ pipeline {
} }
post { post {
always { always {
sh './platforms/nuttx/Debug/jlink_gdb_backtrace.sh build/px4_fmu-v5_stackcheck/px4_fmu-v5_stackcheck.elf || true'
resetBoard() resetBoard()
} }
} }
@ -519,7 +526,7 @@ pipeline {
sh 'make px4_fmu-v5_test' sh 'make px4_fmu-v5_test'
sh 'make px4_fmu-v5_test bootloader_elf' sh 'make px4_fmu-v5_test bootloader_elf'
sh 'ccache -s' sh 'ccache -s'
stash includes: 'build/*/*.elf, platforms/nuttx/Debug/upload_jlink_gdb.sh, Tools/HIL/*.py', name: 'px4_fmu-v5_test' stash includes: 'build/*/*.elf, platforms/nuttx/Debug/*, Tools/HIL/*.py', name: 'px4_fmu-v5_test'
} }
post { post {
always { always {
@ -566,6 +573,7 @@ pipeline {
} }
post { post {
always { always {
sh './platforms/nuttx/Debug/jlink_gdb_backtrace.sh build/px4_fmu-v5_test/px4_fmu-v5_test.elf || true'
resetBoard() resetBoard()
} }
} }
@ -573,73 +581,6 @@ pipeline {
} }
} }
// stage("modalai_fc-v1_test") {
// stages {
// stage("build modalai_fc-v1_test") {
// agent {
// docker {
// image 'px4io/px4-dev-nuttx-focal:2021-09-08'
// args '--cpu-shares 512 -e CCACHE_BASEDIR=$WORKSPACE -v ${CCACHE_DIR}:${CCACHE_DIR}:rw'
// }
// }
// steps {
// checkout scm
// sh 'export'
// sh 'make distclean'
// sh 'ccache -s'
// sh 'git fetch --tags'
// sh 'make modalai_fc-v1_test'
// sh 'make modalai_fc-v1_test bootloader_elf'
// sh 'ccache -s'
// stash includes: 'build/*/*.elf, platforms/nuttx/Debug/upload_jlink_gdb.sh, Tools/HIL/*.py', name: 'modalai_fc-v1_test'
// }
// post {
// always {
// sh 'make distclean'
// }
// }
// } // stage build
// stage("hardware") {
// agent {
// label 'modalai_fc-v1'
// }
// stages {
// stage("flash") {
// steps {
// sh 'export'
// sh 'find /dev/serial'
// unstash 'modalai_fc-v1_test'
// sh './platforms/nuttx/Debug/upload_jlink_gdb.sh build/modalai_fc-v1_test/modalai_fc-v1_bootloader.elf'
// // flash board and watch bootup
// sh './platforms/nuttx/Debug/upload_jlink_gdb.sh build/modalai_fc-v1_test/modalai_fc-v1_test.elf && ./Tools/HIL/monitor_firmware_upload.py --device `find /dev/serial -name *usb-*` --baudrate 57600'
// }
// }
// stage("tests") {
// steps {
// runTests()
// }
// }
// stage("status") {
// steps {
// // configure
// resetParameters()
// sh './Tools/HIL/nsh_param_set.py --device `find /dev/serial -name *usb-*` --name "SYS_AUTOSTART" --value "4001"' // generic quadcopter
// sh './Tools/HIL/nsh_param_set.py --device `find /dev/serial -name *usb-*` --name "SYS_BL_UPDATE" --value "1"' // update bootloader
// checkStatus()
// quickCalibrate()
// }
// }
// stage("print topics") {
// steps {
// printTopics()
// }
// }
// }
// } // stage test
// }
// }
stage("nxp_fmuk66-v3_test") { stage("nxp_fmuk66-v3_test") {
stages { stages {
stage("build nxp_fmuk66-v3_test") { stage("build nxp_fmuk66-v3_test") {
@ -654,7 +595,7 @@ pipeline {
sh 'make nxp_fmuk66-v3_test' sh 'make nxp_fmuk66-v3_test'
//sh 'make nxp_fmuk66-v3_test bootloader_elf' //sh 'make nxp_fmuk66-v3_test bootloader_elf'
sh 'ccache -s' sh 'ccache -s'
stash includes: 'build/*/*.elf, platforms/nuttx/Debug/upload_jlink_gdb.sh, Tools/HIL/*.py', name: 'nxp_fmuk66-v3_test' stash includes: 'build/*/*.elf, platforms/nuttx/Debug/*, Tools/HIL/*.py', name: 'nxp_fmuk66-v3_test'
} }
post { post {
always { always {
@ -701,6 +642,7 @@ pipeline {
} }
post { post {
always { always {
sh './platforms/nuttx/Debug/jlink_gdb_backtrace.sh build/nxp_fmuk66-v3_test/nxp_fmuk66-v3_test.elf || true'
resetBoard() resetBoard()
} }
} }

41
platforms/nuttx/Debug/jlink_gdb_backtrace.sh

@ -0,0 +1,41 @@
#! /bin/sh
if command -v gdb-multiarch &> /dev/null
then
GDB_CMD=$(command -v gdb-multiarch)
elif command -v arm-none-eabi-gdb &> /dev/null
then
GDB_CMD=$(command -v arm-none-eabi-gdb)
else
echo "gdb arm-none-eabi or multi-arch not found"
exit 1
fi
file ${1}
gdb_cmd_file=$(mktemp)
cat >"${gdb_cmd_file}" <<EOL
source ${WORKSPACE}/platforms/nuttx/Debug/NuttX
source ${WORKSPACE}/platforms/nuttx/Debug/ARMv7M
target remote localhost:2331
monitor regs
showtasks
vecstate
info threads
backtrace
bt full
EOL
${GDB_CMD} -silent --nh --nx --nw -batch -x ${gdb_cmd_file} ${1}

12
platforms/nuttx/cmake/jlink.cmake

@ -48,6 +48,18 @@ if(JLinkGDBServerCLExe_PATH)
USES_TERMINAL USES_TERMINAL
) )
# jlink_gdb_backtrace (attach, print current tasks, back trace, exit)
add_custom_target(jlink_gdb_backtrace
COMMAND ${PX4_BINARY_DIR}/jlink_gdb_start.sh
COMMAND ${CMAKE_COMMAND} -E env WORKSPACE=${PX4_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/Debug/jlink_gdb_backtrace.sh $<TARGET_FILE:px4>
DEPENDS
px4
${PX4_BINARY_DIR}/jlink_gdb_start.sh
${CMAKE_CURRENT_SOURCE_DIR}/Debug/jlink_gdb_backtrace.sh
WORKING_DIRECTORY ${PX4_BINARY_DIR}
USES_TERMINAL
)
# jlink_upload_bootloader # jlink_upload_bootloader
# board directory supplied bootloader.bin # board directory supplied bootloader.bin

Loading…
Cancel
Save