디버깅에 중단 점을 사용하는 방법


9

중단 점은 컴파일러가 코드를 어떻게 실행하는지 확인할 수있는 좋은 방법입니다. 이제 제 질문은 코드를 디버깅 할 때 중단 점을 사용할 가능성이 있습니까?

답변:


9

Majenko의 답변에서 언급했듯이 Arduino IDE는 중단 점 메커니즘을 제공하지 않지만 Atmel Studio는 중단 점을 지원합니다 . [*]

그러나 스위치와 LED가 있으면 중단 점의 이점을 제공하는 방식으로 프로그램의 진행 상황을 추적 할 수 있습니다. BPReport()직렬 출력 또는 LCD를 통해 임계 변수 값을보고 한 다음 LED를 켜고 디 바운스로 스위치를 눌렀다 놓을 때까지 기다리는 서브 루틴을 추가합니다 . BPReport()무조건 중단 점을 원할 때 마다 루틴을 호출하십시오 . 조건부 중단 점의 경우 true 인 경우 BPReportIf(cond)호출 하는 루틴 을 가질 수 있습니다 . 직렬을 통해 출력하지 않으려면 여러 개의 LED 또는 LCD를 사용하고 외부 차단 제어를 원할 경우 여러 스위치를 사용할 수 있습니다 (예 : 추가 스위치 중 하나를 테스트 할 수 있음).BPReport()condcond

[*] 일부 하드웨어 디버거는 중단 점이 추가, 변경 또는 제거 될 때마다 다운로드 된 코드를 수정합니다. 이 사용법은 플래시 메모리를 가끔 다운로드하는 것보다 더 빨리 소모됩니다. 이러한 디버깅에 칩이 많이 사용 된 경우 프로덕션 시스템에서 해당 칩을 사용하지 마십시오.


4

Majenko의 대답은 정확하지만 다른 옵션이 있습니다.

majenko가 말한 실제 하드웨어 디버깅에 관해서는 다음과 같이 말합니다.

  1. Atmel Studio 또는 sloeber (I 'm author)라는 arduino eclipse 플러그인과 같은 실제 IDE를 설치하고 사용하십시오.
  2. Arduio zero와 같은 온보드 하드웨어 디버거 또는 하드웨어를 사용하거나 USB 디버깅을 허용하는 ESP8266과 같은 다른 디버깅 기술을 사용하는 하드웨어를 사용하십시오.

완전히 다른 범주의 다른 디버깅 옵션은 의사 결정 논리 (하드웨어 독립)와 작업 (하드웨어 종속)이 완전히 분리되도록 코드를 구성하는 것입니다.

그런 다음 스케치를 로컬 프로그램으로 컴파일하고 로컬 컴퓨터에서 "결정 논리"를 디버그하십시오. 이 방법은 "하드웨어 디버깅"을 허용하지 않습니다. 이 방법은 또한 단위 테스트를 가능하게합니다.

로컬 컴퓨터는 아마도 32 또는 64 비트이고 대부분의 Arduino는 8 비터 이므로이 방법을 사용할 때 추가주의 사항 인 데이터 유형에 차이가 생길 수 있습니다.


4

아두 이노 - 디버그 라이브러리는 아두 이노 스케치에 대한 간단한에서 대상 디버거를 제공합니다. 디버그 명령이 스케치에 직접 추가됩니다. 디버거 명령 셸은 중단 점 및 어설 션에서 시작됩니다.

여기에 이미지 설명을 입력하십시오

위의 스크린 샷은 응용 프로그램에서 사용하는 직렬 출력 모니터와 디버거 쉘에 사용 된 Serial1이있는 Arduino Mega에서 실행되는 스케치 예를 보여줍니다 .

스케치 디버그 명령

  • ASSERT (cond) 어서 트 상태를 확인하십시오. False이면 디버그 셸이 호출됩니다. 스케치를 계속할 수 없습니다.
  • BREAKPOINT () 디버그 셸이 호출됩니다.
  • BREAK_IF (cond) 조건이 true이면 디버그 셸이 호출됩니다.
  • CHECK_STACK (room) 스택에 공간 (바이트)이 있는지 확인하십시오. False이면 디버그 셸이 호출됩니다.
  • DEBUG_STREAM (dev) 디버그 세션에 지정된 스트림 장치를 사용하십시오. 일반적으로 시리얼.
  • OBSERVE (expr) 식을 디버그 스트림에 인쇄합니다.
  • OBSERVE_IF (cond, expr) 조건이 참이면 식을 디버그 스트림에 인쇄합니다.
  • REGISTER (var) 디버그 쉘에서 액세스 할 변수를 등록하십시오. 디버그 쉘 명령

디버그 쉘 명령

  • ? VARIABLE 변수 주소와 값을 인쇄합니다.
  • @VARIABLE 포인터 변수 주소 및 참조 값을 인쇄하십시오.
  • backtrace 간단한 콜 스택을 인쇄합니다.
  • 명령 명령 목록을 인쇄합니다 (도움말 참조).
  • data 데이터 영역의 내용, 즉 전역 변수를 인쇄합니다.
  • 디버그 쉘을 떠나서 스케치 실행을 계속합니다.
  • heap 힙의 내용, 즉 동적 할당 데이터를 인쇄합니다.
  • help 명령 목록을 인쇄하십시오.
  • 메모리 메모리 상태를 인쇄합니다.
  • 스케치를 종료합니다 .
  • stack 스택의 내용, 즉 호출 프레임, 인수, 반환 주소를 인쇄합니다.
  • 변수 등록 된 변수 목록을 인쇄합니다.
  • 여기서 디버그 쉘이 호출 된 인쇄 소스 코드 파일과 행.

모든 디버그 쉘 명령은 단일 문자 명령으로 축약 될 수 있습니다. 자세한 내용은 README를 참조하십시오. 설치 세부 사항, 예제 스케치 및 벤치마킹.


1
Mikael의 기증 라이브러리를 사용하면 조건부 중단 점 설정, 변수 값 인쇄, 메모리 상태, 호출 추적 및 중단 점에서 변수 검사 및 변경을 수행 할 수 있습니다. 장점 : 하드웨어 ($$)가 필요하지 않으며, 하드웨어 디버거를 사용하여 중단 점을 설정하고 제거하는 것처럼 플래시에서 하드처럼 두드리지 않습니다. ....
JRobert

1
.... 단점 : 시간이 중요한 코드를 검사하는 경우 프로그램의 코드 공간, 일부 RAM 공간 및 런타임에 더 큰 영향을줍니다. 라이브러리 호출을 컴파일 (및 나중에 제거)하기위한 학습 곡선; 필요한 위치를 발견하면 중단 점 위치를 예상하거나 다시 컴파일해야합니다. 단점은 미카엘의 일에 대한 비판이 아니다. 그들은이 기술과 함께 제공됩니다.
JRobert

1
@JRobert Nice Pro-Con 요약! 디버거를 조정하여 일부 단점을 해결하려고했습니다. 풋 프린트에 민감한 애플리케이션이 디버그 셸을 최소로 줄일 수 있도록하는 일련의 정의가 있습니다. 임베디드 시스템을위한 디버거로서, 중단 점으로 시간이 중요한 (연속적인) 코드를 디버깅하는 것은 어렵다 유일한 대안은 관측점입니다. 추적 버퍼를 사용하여 최적화 할 수 있으며 시간이 중요한 코드에서 직렬 출력을 제거 할 수 있습니다.
Mikael Patel

3

Arduino IDE에는 없습니다.

다음을 수행해야합니다.

  1. Atmel Studio와 같은 실제 IDE 설치 및 사용
  2. 완전한 하드웨어 디버거 사용

부트 로더를 사용하여 UART / USB 인터페이스를 통한 디버깅 준비는 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.