18. 디버깅과 진단
18.1 4계층별 디버깅 및 진단 전략
리눅스 및 임베디드 환경(특히 i.MX8M Plus 같은 SoC)에서 오디오 버그를 잡는 것은 "소프트웨어 앱부터 물리적인 전기 신호까지" 전체 스택을 꿰뚫어 봐야 하는 고난도 작업입니다.
"소리가 안 나요" 혹은 "지직거려요"라는 막연한 증상을 논리적으로 파헤치는 단계별 디버깅 및 진단 전략을 4개의 계층으로 나누어 설명해 드릴게요.
1단계: ALSA 가상 파일시스템 (/proc/asound) 진단
가장 먼저 커널이 하드웨어를 어떻게 인식하고 있는지 확인하는 '엑스레이' 단계입니다.
• 사운드 카드 인식 확인:카드가 보이지 않는다면 드라이버 로드 실패, Device Tree(DT) 설정 오류, 또는 하드웨어 핀 연결 문제입니다.
• 실시간 스트림 상태 확인 (가장 중요): 오디오를 재생 중일 때 아래 파일을 열어봅니다.
• state: RUNNING : 정상 동작 중.
• state: XRUN : 오버런/언더런 발생 (버퍼나 스케줄링 문제).
• state: SUSPENDED : 전원 관리로 인해 장치가 잠듦.
• hw_ptr, appl_ptr 값이 계속 증가하고 있는지 확인합니다. 숫자가 멈춰있다면 DMA나 인터럽트가 죽은 것입니다.
• 하드웨어 파라미터 확인:현재 앱이 요청한 샘플 레이트(예: 48000), 포맷(S16_LE), 채널 수가 하드웨어 스펙과 정확히 일치하는지 점검합니다.
2단계: 유저 스페이스 툴킷 (alsa-utils) 활용
PulseAudio나 PipeWire 같은 복잡한 사운드 서버를 모두 끄고, ALSA 코어와 하드웨어가 직접 통신하도록 테스트하여 범인을 좁히는 단계입니다.
• 화이트 노이즈 테스트:이 명령어로 "삐-" 소리가 난다면 커널과 하드웨어는 정상입니다. 문제가 있다면 PulseAudio 등 상위 계층의 설정(라우팅) 문제입니다.
• 믹서(Mixer) 경로 추적:임베디드 코덱(예: SGTL5000, WM8960)은 내부에 복잡한 스위치와 볼륨 조절기를 가집니다. 재생은 되고 있는데 소리가 안 난다면, Playback Switch가 Mute(Off)로 되어 있거나 Volume이 0인지 확인해야 합니다.
3단계: 커널 및 드라이버 심층 분석 (dmesg & Ftrace)
에러 로그를 분석하고 인터럽트 지연을 추적하는 단계입니다.
• dmesg 분석:
• ASoC: no backend DAIs enabled for ... : 라우팅(DPCM 토폴로지) 설정이 끊어져 있습니다.
• clock missing 또는 pll lock failed : 오디오 클럭 설정 오류입니다. Device Tree의 클럭 트리를 확인해야 합니다.
• Ftrace / IRQ 디버깅: XRUN이 간헐적으로 발생할 때 유용합니다.재생 중에 인터럽트 카운트가 꾸준히 증가하는지 봅니다. 증가하지 않는다면 하드웨어가 CPU를 깨우지 못하는 것입니다. (I2S 클럭 미설정 등)
• SOF (Sound Open Firmware) 로거 (i.MX8M Plus 등): DSP를 사용하는 환경이라면 커널 로그 외에 DSP 내부 로그를 봐야 합니다.DSP 내부의 파이프라인(Mixer, EQ, DMA) 어디서 데이터가 멈췄는지 초정밀 진단이 가능합니다.
4단계: 물리 계층 하드웨어 측정 (Oscilloscope)
소프트웨어에서는 전부 정상(RUNNING)이라고 뜨는데 스피커에서는 소리가 안 나는 귀신 같은 상황일 때 꺼내는 최종 무기입니다.
- I2S / SAI 신호 측정: 오실로스코프나 로직 애널라이저를 SoC와 코덱 칩 사이의 핀에 찍어봅니다.
- MCLK (Master Clock): 칩셋 구동용 메인 클럭이 뛰고 있는가? (예: 12.288MHz, 24.576MHz)
- BCLK (Bit Clock): 데이터 비트를 밀어내는 클럭이 정확한가? ()
- LRCLK (Word Select): 좌우 채널(48kHz 등) 주기에 맞춰 정확히 토글되는가?
- TX/RX (Data): 신호가 0과 1로 명확하게 변하고 있는가?
요약: 오디오 디버깅 체크리스트
- [HW] 오실로스코프로 I2S 클럭(BCLK, LRCLK)이 제대로 나오는지 본다. (보통 여기서 절반 이상 해결됨)
- [Kernel] /proc/asound/cards에 카드가 떴는지, dmesg에 에러가 없는지 본다.
- [ALSA] amixer로 음소거가 안 되어 있는지 확인하고, speaker-test로 하드웨어 직결 테스트를 한다.
- [Status] 스트림 재생 중 /proc/asound/cardX/.../status를 보며 포인터가 움직이는지, XRUN이 안 뜨는지 확인한다.
18.2 사용자 공간 도구
| 도 구 | 용 도 | 예 제 |
| aplay | WAV 파일 재생 | aplay -D hw:0,0 test.wav |
| arecord | 오디오 녹음 | arecord -D hw:0,0 -f S16_LE -r 48000 out.wav |
| amixer | 믹서 제어 | amixer sset Master 80% |
| alsactl | ALSA 상태 저장/복원 | alsactl store / alsactl restore |
| speaker-test | 채널 테스트 (톤 생성) | speaker-test -c 2 -t wav |
| alsa-info | 시스템 정보 수집 | alsa-info --no-upload |
| cat /proc/asound/* | 커널 상태 읽기 | cat /proc/asound/cards |
18.2 /proc/asound와 debugfs
18.3 커널 디버깅
18.4 자주 발생하는 문제
| 증 상 | 원 인 | 해 결 법 |
| 소리 안 남 | 뮤트 상태, 잘못된 디바이스 | amixer로 볼륨 확인, aplay -L로 디바이스 확인 |
| Crackling/Popping | 버퍼 너무 작음, CPU 부하 | period/buffer 크기 증가, CPU governor 조정 |
| XRUN 발생 | 실시간 스케줄링 부족 | RT 우선순위 설정, buffer 크기 증가 |
| 높은 지연시간 | 버퍼 너무 큼, PulseAudio | period/buffer 감소, ALSA 직접 사용 |
| 한쪽 채널만 나옴 | 잘못된 채널맵, 불량 케이블 | speaker-test로 테스트, 하드웨어 확인 |
| USB Audio 끊김 | USB 전원 관리 | echo on > /sys/bus/usb/devices/*/power/control |
| HDMI 소리 안 남 | ELD 정보 없음, 모니터 대기 | cat /proc/asound/card*/eld*, 모니터 전원 확인 |
| Headphone detection 안 됨 | Pin configuration 오류 | HD Audio: hdajackretask 또는 커널 파라미터 |
'Embedded : : Linux > : : ALSA' 카테고리의 다른 글
| [ALSA] 17. 가상화 환경 오디오 (0) | 2026.03.11 |
|---|---|
| [ALSA] 16. 지연시간 최적화 (0) | 2026.03.11 |
| [ALSA] 15. DMA와 버퍼 관리 (0) | 2026.03.11 |
| [ALSA] 13. USB Audio (0) | 2026.03.11 |
| [ALSA] 12. HD Audio (HDA) 서브시스템 (0) | 2026.03.11 |