이 "expect" 스크립트를 통해 시작될 때 gdb 클라이언트가 gdb 서버와 통신할 수 없는 이유는 무엇입니까?

이 "expect" 스크립트를 통해 시작될 때 gdb 클라이언트가 gdb 서버와 통신할 수 없는 이유는 무엇입니까?

저는 Segger JLink 장치를 사용하여 ARM Cortex M0을 프로그래밍하고 gdb 및 Segger의 RTT 도구를 사용하여 대상에서 테스트를 실행하면서 펌웨어 코드베이스를 위한 지속적인 통합 환경을 구축하고 있습니다.

"expect"에서 세 가지 프로세스를 시작해야 합니다.

  1. gdb 서버. 이는 다음의 연결을 수신합니다.
  2. gdb 클라이언트.
  3. Segger의 RTT 클라이언트는 테스트가 어떻게 진행되고 있는지 확인할 수 있도록 대상의 출력을 호스트 터미널에 기록합니다.

나는 모든 목표에 대해 "설정"한 목표를 가지고 있습니다. 인간으로 테스트를 실행할 때 각 테스트에 대한 터미널 탭을 엽니다. 터미널에서 하나씩 실행하면 모두 정상적으로 실행됩니다. 그러나 다음 "expect" 스크립트를 통해 실행하면 gdb 클라이언트는 콘텐츠를 gdb 서버로 전송해야 하는 지점에서 중지됩니다. 왜?

#!/usr/bin/expect

# Bike Tracker firmware/hardware test. For syntax, see "man expect".

# gdb server
spawn /Applications/SEGGER/JLink/JLinkGDBServer -device nrf51822 -if swd -speed 4000 -port 2331
expect {
  -ex "Waiting for GDB connection..."
}
sleep 1
send_user "\nexpect: gdb server running OK\n"

# gdb client
spawn ~/dev/gcc-arm-none-eabi-4_9-2015q1/bin/arm-none-eabi-gdb -x ./_build/.gdbinit ./_build/biketracker_app_s130.elf
sleep 2
set timeout 10
expect {
  -ex "(gdb)" {
    send "cont"
    send "cont"
  }
  -ex "Operation timed out" {
    send_user "expect: Timed out on gdb client. Did the server start OK?\n"
    exit 1
  }
  timeout {
    send_user "\nexpect: Timed out on gdb client output.\n"
    exit 1
  }
}
send_user "\nexpect: gdb client running OK\n"

# Segger RTT client
spawn /Applications/SEGGER/JLink/JLinkRTTClient -device nrf51822 -if swd -speed 4000
# If we do an RX operation on the modem, that takes 6s for the TX and about 30s for the RX.
set timeout 40
expect {
  -ex "END_OF_TEST" { exit 0 }
  eof { exit 0 }
  -ex "ASSERT" {
    send_user "\nexpect: A test failed. See RTT output for details.\n"
    exit 1
  }
  timeout {
    send_user "\nexpect: Timed out on RTT output.\n"
    exit 1
  }
}

터미널 출력:

expect test.expect
spawn /Applications/SEGGER/JLink/JLinkGDBServer -device nrf51822 -if swd -speed 4000 -port 2331
SEGGER J-Link GDB Server V5.12f Command Line Version

JLinkARM.dll V5.12f (DLL compiled May 17 2016 16:04:43)

-----GDB Server start settings-----
GDBInit file:                  none
GDB Server Listening port:     2331
SWO raw output listening port: 2332
Terminal I/O port:             2333
Accept remote connection:      yes
Generate logfile:              off
Verify download:               off
Init regs on start:            off
Silent mode:                   off
Single run mode:               off
Target connection timeout:     0 ms
------J-Link related settings------
J-Link Host interface:         USB
J-Link script:                 none
J-Link settings file:          none
------Target related settings------
Target device:                 nrf51822
Target interface:              SWD
Target interface speed:        4000kHz
Target endian:                 little

Connecting to J-Link...
J-Link is connected.
Firmware: J-Link ARM V8 compiled Nov 28 2014 13:44:46
Hardware: V8.00
S/N: 268006243
OEM: SEGGER-EDU
Feature(s): FlashBP, GDB
Checking target voltage...
Target voltage: 3.04 V
Listening on TCP/IP port 2331
Connecting to target...Connected to target
Waiting for GDB connection...
expect: gdb server running OK
spawn ~/dev/gcc-arm-none-eabi-4_9-2015q1/bin/arm-none-eabi-gdb -x ./_build/.gdbinit ./_build/biketracker_app_s130.elf
GNU gdb (GNU Tools for ARM Embedded Processors) 7.8.0.20150304-cvs
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-apple-darwin10 --target=arm-none-eabi".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./_build/biketracker_app_s130.elf...done.
0x0002ecf2 in rx_done_event (bytes=1 '\001', p_data=0x20002cec <rx_buffer> ",") at /Users/Eliot/dev/nRF5_SDK_11.0.0_89a8197/components/drivers_nrf/uart/nrf_drv_uart.c:631
631     m_cb.handler(&event,m_cb.p_context);
Loading section .text, size 0x1fbec lma 0x1b000

expect: Timed out on gdb client output.

답변1

문제는 gdb 서버 출력이 아무도 읽지 않아 차단되어 gdb 클라이언트도 차단된다는 것일 수 있습니다. expect다음을 사용하여 gdb의 나머지 출력을 읽고 무시할 수 있습니다.

expect_background eof exit

이로 인해 마지막으로 생성된 명령은 파일의 끝을 읽을 때까지 출력을 계속합니다.

관련 정보