Capturar logs e analisar falhas¶
Os guias debug_logging e crash_analysis do SDK se complementam: os logs mostram o que cada um dos dois núcleos estava executando, enquanto uma imagem de memória capturada permite que o depurador recupere o contexto da falha. Guarde com cada captura o ELF exato, os arquivos map/symbol, a revisão do SDK, o modelo do chip, a configuração e a revisão da placa.
Escolher a conexão de depuração¶
Tabela: Conexões de depuração e log por família SF32
| Família | Comportamento de depuração e log |
|---|---|
| SF32LB52x, SF32LB56x, SF32LB58x | O guia de referência documenta a captura por UART, SifliUsartServer/AssertDumpUart e a recuperação com J-Link/Trace32. Use o transporte que permanecer disponível no estado de suspensão selecionado. |
| SF32LB55x | O SWD pode alternar entre HCPU e LCPU usando $SDK_ROOT/tools/segger/jlink_hcpu_a0.bat e jlink_lcpu_a0.bat. O console ROM do LCPU usa UART3 a 1 000 000 baud; o HCPU pode usar UART1/2 ou SWD. Como o SWD usa os pinos PB, mantenha o LPSYS ativo ou em light sleep durante a conexão. |
Quando o LPSYS sai do standby, o SWD volta para o HCPU. Um reset do J-Link não altera, por si só, o núcleo selecionado. Se o log assíncrono estiver habilitado, o dump de assert poderá ficar truncado; para registrar a falha, use uma captura síncrona ou um mecanismo que retenha os dados.
Capturar um pacote em tempo real ou post-mortem¶
Nas versões atuais do SDK, capture pela UART ou por J-Link com sdk.py:
Escopo do exemplo
O comando abaixo é um exemplo para SF32LB52/LB525. Mantenha a estrutura do comando, mas substitua o chip/modelo, o núcleo, o transporte e o ELF por valores compatíveis com a família e a versão do SDK de destino.
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
Adicione --include-psram --psram-size 8MB quando o alvo usar PSRAM. Uma sonda J-Link pode usar --transport jlink --jlink-ip 127.0.0.1:19025; selecione o núcleo afetado com --core hcpu ou --core lcpu. O diretório de saída deve conter o binário capturado, o ELF/AXF do núcleo, log.txt, manifest.json e sdk_manifest.json.
Em versões antigas do SDK, use o método específico da família indicado no guia de origem:
- UART:
SifliUsartServerouAssertDumpUartpode exportar um pacote de assert enquanto o console estiver disponível. - J-Link/SWD: adicione o J-Link ao
PATHe execute o script da família de destino. Por exemplo, no SF32LB55x, use$SDK_ROOT/tools/crash_dump_analyser/script/save_ram_55x.bat. O script correspondente salva a RAM, os registradores EPIC e a PSRAM. - Quando precisar de evidências de vazamento de heap, habilite
RTOS → RT-Thread Kernel → Memory Management → Enable memory trace.
Em capturas feitas por script, escolha o arquivo .jlink de acordo com a família do alvo, a configuração de PSRAM e o método de conexão. Use um script no modo IP com o caminho SifliUsartServer e um script no modo USB para conexão direta por J-Link; uma incompatibilidade pode fazer a captura falhar.

A captura por UART normalmente exige que o utilitário serial, o endereço do servidor e o núcleo de destino correspondam. As capturas de tela do guia a seguir ajudam a verificar a conexão:



Restaurar e analisar o contexto¶
Converta o pacote capturado em um arquivo core legível pelo depurador e analise-o com o ELF correspondente:
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
No fluxo antigo com Trace32, carregue um pacote de assert do HCPU usando o botão HCPU assertion (HA) e run_next_step; para um dump do LCPU, use a configuração de recuperação do LCPU. Se a pilha de exceção não aparecer, confirme a seleção do núcleo, o ELF e as regiões de memória antes de interpretar os registradores.


Parar cedo durante a inicialização ou diante de uma possível condição de corrida¶
Para depurar a inicialização, descomente a primeira instrução do Reset_Handler correspondente para que ela se torne B .:
Os caminhos de arquivos de inicialização abaixo são do SF32LB55x; para outra família, use os arquivos correspondentes.
- HCPU:
$SDK_ROOT/drivers/cmsis/sf32lb55x/Templates/arm/startup_bf0_hcpu.S - LCPU:
$SDK_ROOT/drivers/cmsis/sf32lb55x/Templates/arm/startup_bf0_lcpu.S
Conecte o J-Link e avance o PC em dois bytes para continuar. Em C, _asm("B ."); cria a mesma parada intencional. Não substitua por while (1);: o compilador pode eliminar o código que vem depois do loop.
Analisar as evidências¶
Um dump de assert normalmente inclui a função e a linha do assert, a tabela de threads, o estado do mailbox e das filas de mensagens, mutexes, semáforos, uso do heap e registradores da CPU. Relacione o PC da falha ao ELF exato e verifique a margem de espaço na pilha, quem detém os recursos envolvidos em esperas bloqueadas, as entradas das filas e o último log anterior à falha. Preserve o dump bruto antes de simbolizá-lo.
Para inspeção interativa, o Ozone pode carregar os ELF de HCPU/LCPU e o arquivo SVD correspondente ao Cortex-M33 com FPU em $SDK_ROOT/tools/svd_external. Use UART ou SifliUsartServer quando o núcleo estiver em um estado que impeça a conexão por SWD. O ULOG pode usar UART; após habilitar o suporte a RTT, selecione segger como dispositivo de log do RT-Thread para usar Segger RTT.
Instrumentar falhas de barramento e memória¶
O monitor de barramento do SDK pode capturar acessos que levam a uma falha de barramento. Registre um callback com dbg_busmon_reg_callback e use dbg_busmon_read e dbg_busmon_write, como no exemplo de referência, para inspecionar o intervalo de endereços relevante. Combine isso com o rastreamento do heap e o pacote de falha; um dump de registradores sem símbolos ou contexto de memória raramente é suficiente.

Fontes oficiais por família: análise de falhas do SF32LB52x, SF32LB55x, SF32LB56x, SF32LB58x e o guia de depuração e logs.
Última atualização: