콘텐츠로 이동

로그 캡처와 크래시 분석

SDK의 debug_logging 가이드와 crash_analysis 가이드는 서로 보완 관계입니다. 로그는 두 코어가 무엇을 하고 있었는지 설명하고, 캡처한 메모리 이미지는 디버거가 실패한 컨텍스트를 복구할 수 있게 해 줍니다. 모든 캡처에는 정확한 ELF, 맵/심볼 파일, SDK 리비전, 칩 모델, 구성, 보드 리비전을 함께 보관하십시오.

디버그 연결 선택

표: SF32 제품군별 디버그 및 로그 연결

제품군 디버그 및 로그 동작
SF32LB52x, SF32LB56x, SF32LB58x 소스 가이드는 UART 캡처, SifliUsartServer/AssertDumpUart, J-Link/Trace32 복구를 문서화합니다. 선택한 슬립 상태에서 계속 사용할 수 있는 전송 방식을 사용하십시오.
SF32LB55x $SDK_ROOT/tools/segger/jlink_hcpu_a0.bat과 jlink_lcpu_a0.bat 스크립트로 SWD를 HCPU와 LCPU 사이에서 전환할 수 있습니다. LCPU의 ROM 콘솔은 보레이트 1,000,000의 UART3이며, HCPU는 UART1/2 또는 SWD를 사용할 수 있습니다. SWD는 PB IO를 사용하므로 연결하는 동안 LPSYS를 활성 상태 또는 Light Sleep 상태로 유지하십시오.

LPSYS가 Standby에서 웨이크하면 SWD가 HCPU로 돌아갑니다. J-Link 리셋만으로는 선택된 코어가 전환되지 않습니다. 비동기 로깅이 활성화되어 있으면 assert 덤프가 잘릴 수 있으므로, 실패 경로에서는 동기 방식 또는 보존형 캡처를 사용하십시오.

라이브 또는 사후 분석 패키지 캡처

현재 SDK 릴리스에서는 sdk.py로 UART 또는 J-Link를 통해 캡처합니다.

예제 범위

아래 명령은 SF32LB52/LB525 예제입니다. 명령 구조는 유지하되, 칩/모델, 코어, 전송 방식, ELF는 대상 제품군과 SDK 릴리스에서 지원하는 값으로 바꾸십시오.

sdk.py crash-dump capture-live --transport uart --probe /dev/ttyUSB0 \
  --chip SF32LB52 --chip-model LB525 \
  --output /tmp/live-crash --elf build_hcpu/main.elf

대상이 PSRAM을 사용하면 --include-psram --psram-size 8MB를 추가하십시오. J-Link 프로브는 --transport jlink --jlink-ip 127.0.0.1:19025를 사용할 수 있으며, 영향을 받은 코어는 --core hcpu 또는 --core lcpu로 선택합니다. 출력 디렉터리에는 캡처한 바이너리, 코어 ELF/AXF, log.txt, manifest.json, sdk_manifest.json이 있어야 합니다.

이전 SDK에서는 소스 가이드의 제품군별 방법을 사용하십시오.

  • UART: 콘솔을 사용할 수 있는 동안 SifliUsartServer 또는 AssertDumpUart로 어서트 패키지를 내보낼 수 있습니다.
  • J-Link/SWD: J-Link를 PATH에 추가한 다음 대상 제품군의 스크립트를 실행합니다. 예를 들어 SF32LB55x는 $SDK_ROOT/tools/crash_dump_analyser/script/save_ram_55x.bat을 사용합니다. 해당 스크립트는 RAM, EPIC 레지스터, PSRAM을 저장합니다.
  • 힙 누수 증거가 필요하면 RTOS → RT-Thread Kernel → Memory Management → Enable memory trace가 활성화되어 있는지 확인합니다.

스크립트 기반 캡처에서는 .jlink 파일을 대상 제품군/PSRAM 구성과 연결 방식 모두에 맞추십시오. SifliUsartServer 경로에는 IP 모드 스크립트를, J-Link 직접 연결에는 USB 모드 스크립트를 사용하십시오. 맞지 않으면 캡처가 실패할 수 있습니다.

menuconfig의 SF32LB52x 메모리 트레이스 옵션

그림: SF32LB52x 가이드 예시 — 힙 증거가 필요하면 실패를 재현하기 전에 메모리 트레이스를 활성화합니다.

UART 캡처에서는 보통 시리얼 유틸리티, 서버 주소, 대상 코어를 맞춰야 합니다. 가이드의 다음 스크린샷은 연결을 점검하는 데 유용합니다.

SiFli_Trace 및 SifliUsartServer 도구 위치

그림: SF32LB52x 가이드 예시 — 도구 디렉터리.

SF32LB52x의 SifliUsartServer 연결 설정

그림: SF32LB52x 가이드 예시 — 시리얼 포트, 보레이트, 서버 주소, 디버그 코어가 캡처 대상과 일치해야 합니다.

크래시 덤프 분석기의 RAM 저장 스크립트

그림: SF32LB52x 가이드 예시 — 이 디렉터리에는 `save_ram_55x.bat`, `save_ram_58x.bat`, `save_ram_uart_52x.bat`처럼 제품군 및 전송 방식별 스크립트가 있습니다. 대상과 연결 방식에 맞는 것을 선택하십시오.

컨텍스트 복원과 분석

캡처한 패키지를 디버거에서 읽을 수 있는 코어로 변환하고, 일치하는 ELF로 분석합니다.

sdk.py crash-dump readcore --package /tmp/live-crash \
  --elf build_hcpu/main.elf --output /tmp/live-crash/coredump.elf
sdk.py crash-dump analyze --core /tmp/live-crash/coredump.elf \
  --elf build_hcpu/main.elf

이전 Trace32 워크플로는 HCPU 어서트(HA) 버튼과 run_next_step으로 HCPU 어서트 패키지를 로드합니다. LCPU 덤프에는 LCPU 복구 구성을 사용하십시오. 예외 스택이 표시되지 않으면 레지스터를 해석하기 전에 코어 선택, ELF, 메모리 범위를 확인하십시오.

Trace32 캡처 스크립트 선택 예

그림: SF32LB52x 가이드 예시 — J-Link/Trace32 캡처 스크립트 선택.

Trace32 HCPU 어서트 창

그림: SF32LB52x 가이드 예시 — 복구 후 콜 스택, 스레드 목록, 힙, 오류 원인을 함께 확인합니다.

부팅 중 또는 경쟁 상태 의심 시 조기 정지

초기화를 디버깅하려면 해당 Reset_Handler의 첫 번째 명령 주석을 해제하여 B .가 되게 하십시오.

아래의 시작 파일 경로는 SF32LB55x 소스 경로입니다. 다른 제품군에는 해당하는 시작 파일을 사용하십시오.

  • HCPU: $SDK_ROOT/drivers/cmsis/sf32lb55x/Templates/arm/startup_bf0_hcpu.S
  • LCPU: $SDK_ROOT/drivers/cmsis/sf32lb55x/Templates/arm/startup_bf0_lcpu.S

J-Link에서 PC를 2바이트 앞으로 이동하면 실행을 재개할 수 있습니다. C 코드에서는 _asm("B .");로 같은 방식의 의도적 정지를 구현합니다. 이를 while (1);으로 대체하지 마십시오. 컴파일러가 루프 뒤의 코드를 최적화 과정에서 제거할 수 있습니다.

증거 읽기

어서트 덤프에는 보통 어서트 함수와 줄 번호, 스레드 테이블, 메일박스와 메시지 큐 상태, 뮤텍스, 세마포어, 힙 사용량, CPU 레지스터가 포함됩니다. 실패한 PC를 정확한 ELF와 대조한 다음, 스택 여유, 차단된 대기와 관련된 리소스의 소유권, 큐 항목, 실패 직전의 마지막 로그 항목을 확인하십시오. 심볼화하기 전에 원본 덤프를 보존하십시오.

대화형 검사에는 Ozone이 HCPU/LCPU ELF와 $SDK_ROOT/tools/svd_external의 일치하는 Cortex-M33-with-FPU SVD를 로드할 수 있습니다. 코어가 SWD로 연결할 수 없는 상태이면 UART 또는 SifliUsartServer를 사용하십시오. ULOG는 UART를 사용할 수 있으며, RTT 지원을 활성화한 후 RT-Thread 로그 디바이스로 segger를 선택하면 Segger RTT를 사용할 수 있습니다.

버스 및 메모리 장애 계측

SDK 버스 모니터는 버스 폴트로 이어지는 접근을 캡처할 수 있습니다. dbg_busmon_reg_callback으로 콜백을 등록한 다음, 가이드의 예제에서 dbg_busmon_read와 dbg_busmon_write를 사용하여 관련 주소 범위를 검사하십시오. 이를 힙 트레이싱 및 크래시 패키지와 함께 사용하십시오. 심볼이나 메모리 컨텍스트가 없는 레지스터 덤프만으로는 충분한 경우가 드뭅니다.

Trace32 힙 콜 스택 예

그림: SF32LB52x 가이드 예시 — 힙 콜 스택과 메모리 창.

공식 제품군 출처: SF32LB52x 크래시 분석, SF32LB55x, SF32LB56x, SF32LB58x, 그리고 해당 디버깅 및 로깅 가이드.

최종 업데이트: