Embedded : : Linux/: : ALSA

[ALSA] 18. 디버깅과 진단

Jay.P Morgan 2026. 3. 11. 15:33

 

 

 

  18.  디버깅과 진단

 

  18.1  4계층별 디버깅 및 진단 전략

 

리눅스 및 임베디드 환경(특히 i.MX8M Plus 같은 SoC)에서 오디오 버그를 잡는 것은 "소프트웨어 앱부터 물리적인 전기 신호까지" 전체 스택을 꿰뚫어 봐야 하는 고난도 작업입니다.

"소리가 안 나요" 혹은 "지직거려요"라는 막연한 증상을 논리적으로 파헤치는 단계별 디버깅 및 진단 전략을 4개의 계층으로 나누어 설명해 드릴게요.

 

1단계: ALSA 가상 파일시스템 (/proc/asound) 진단

가장 먼저 커널이 하드웨어를 어떻게 인식하고 있는지 확인하는 '엑스레이' 단계입니다.

       사운드 카드 인식 확인:카드가 보이지 않는다면 드라이버 로드 실패, Device Tree(DT) 설정 오류, 또는 하드웨어 핀 연결 문제입니다.

 
  cat /proc/asound/cardX/usbbus
 

 

       실시간 스트림 상태 확인 (가장 중요): 오디오를 재생 중일 때 아래 파일을 열어봅니다.

 
  cat /proc/asound/card0/pcm0p/sub0/status
 

              state: RUNNING : 정상 동작 중.

              state: XRUN : 오버런/언더런 발생 (버퍼나 스케줄링 문제).

              state: SUSPENDED : 전원 관리로 인해 장치가 잠듦.

              hw_ptr, appl_ptr 값이 계속 증가하고 있는지 확인합니다. 숫자가 멈춰있다면 DMA나 인터럽트가 죽은 것입니다.

 

       하드웨어 파라미터 확인:현재 앱이 요청한 샘플 레이트(예: 48000), 포맷(S16_LE), 채널 수가 하드웨어 스펙과 정확히 일치하는지 점검합니다.

 
  cat /proc/asound/card0/pcm0p/sub0/hw_params
 

 

 

2단계: 유저 스페이스 툴킷 (alsa-utils) 활용

PulseAudio나 PipeWire 같은 복잡한 사운드 서버를 모두 끄고, ALSA 코어와 하드웨어가 직접 통신하도록 테스트하여 범인을 좁히는 단계입니다.

       화이트 노이즈 테스트:이 명령어로 "삐-" 소리가 난다면 커널과 하드웨어는 정상입니다. 문제가 있다면 PulseAudio 등 상위 계층의 설정(라우팅) 문제입니다.

 
  speaker-test -D hw:0,0 -c 2 -r 48000 -F S16_LE -t sine
 

 

       믹서(Mixer) 경로 추적:임베디드 코덱(예: SGTL5000, WM8960)은 내부에 복잡한 스위치와 볼륨 조절기를 가집니다. 재생은 되고 있는데 소리가 안 난다면, Playback Switch가 Mute(Off)로 되어 있거나 Volume이 0인지 확인해야 합니다.

 
  amixer -c 0 contents
 

 

 

3단계: 커널 및 드라이버 심층 분석 (dmesg & Ftrace)

에러 로그를 분석하고 인터럽트 지연을 추적하는 단계입니다.

       dmesg 분석:

              ASoC: no backend DAIs enabled for ... : 라우팅(DPCM 토폴로지) 설정이 끊어져 있습니다.

              clock missing 또는 pll lock failed : 오디오 클럭 설정 오류입니다. Device Tree의 클럭 트리를 확인해야 합니다.

       Ftrace / IRQ 디버깅: XRUN이 간헐적으로 발생할 때 유용합니다.재생 중에 인터럽트 카운트가 꾸준히 증가하는지 봅니다. 증가하지 않는다면 하드웨어가 CPU를 깨우지 못하는 것입니다. (I2S 클럭 미설정 등)

 
  cat /proc/interrupts | grep snd
 

 

       SOF (Sound Open Firmware) 로거 (i.MX8M Plus 등): DSP를 사용하는 환경이라면 커널 로그 외에 DSP 내부 로그를 봐야 합니다.DSP 내부의 파이프라인(Mixer, EQ, DMA) 어디서 데이터가 멈췄는지 초정밀 진단이 가능합니다.

 
  sof-logger -t
 

 

4단계: 물리 계층 하드웨어 측정 (Oscilloscope)

소프트웨어에서는 전부 정상(RUNNING)이라고 뜨는데 스피커에서는 소리가 안 나는 귀신 같은 상황일 때 꺼내는 최종 무기입니다.

  • I2S / SAI 신호 측정: 오실로스코프나 로직 애널라이저를 SoC와 코덱 칩 사이의 핀에 찍어봅니다.
    1. MCLK (Master Clock): 칩셋 구동용 메인 클럭이 뛰고 있는가? (예: 12.288MHz, 24.576MHz)
    2. BCLK (Bit Clock): 데이터 비트를 밀어내는 클럭이 정확한가? ()
    3. LRCLK (Word Select): 좌우 채널(48kHz 등) 주기에 맞춰 정확히 토글되는가?
    4. TX/RX (Data): 신호가 0과 1로 명확하게 변하고 있는가?

 

 

요약: 오디오 디버깅 체크리스트

  1. [HW] 오실로스코프로 I2S 클럭(BCLK, LRCLK)이 제대로 나오는지 본다. (보통 여기서 절반 이상 해결됨)
  2. [Kernel] /proc/asound/cards에 카드가 떴는지, dmesg에 에러가 없는지 본다.
  3. [ALSA] amixer로 음소거가 안 되어 있는지 확인하고, speaker-test로 하드웨어 직결 테스트를 한다.
  4. [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
 
  # 사용 가능한 PCM 디바이스 나열
  $ aplay -l
  **** List of PLAYBACK Hardware Devices ****
  card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
  card 0: PCH [HDA Intel PCH], device 3: HDMI 0 [HDMI 0]
    Subdevices: 1/1
    Subdevice #0: subdevice #0
 
  # 하드웨어 파라미터 확인
  $ cat /proc/asound/card0/pcm0p/sub0/hw_params
  access: MMAP_INTERLEAVED
  format: S16_LE
  subformat: STD
  channels: 2
  rate: 48000 (48000/1)
  period_size: 1024
  buffer_size: 4096
 
  # Control elements 나열
  $ amixer -c 0 contents
  numid=1,iface=MIXER,name='Master Playback Volume'
        ; type=INTEGER,access=rw---R--,values=2,min=0,max=87,step=0
        : values=70,70
        | dBscale-min=-65.25dB,step=0.75dB,mute=0
  numid=2,iface=MIXER,name='Master Playback Switch'
        ; type=BOOLEAN,access=rw------,values=2
        : values=on,on
 

 

 

  18.2  /proc/asound와 debugfs

 

 
  # HDA 코덱 정보 (매우 상세)
  $ cat /proc/asound/card0/codec#0
  Codec: Realtek ALC892
  Address: 0
  AFG Function Id: 0x1 (unsol 1)
  Vendor Id: 0x10ec0892
  Subsystem Id: 0x14627b71
  Revision Id: 0x100302
  No Modem Function Group found
  Default PCM:
          rates [0x5f0]: 32000 44100 48000 88200 96000 192000
          bits [0xe]: 16 20 24
          formats [0x1]: PCM
  ...
 
  Node 0x02 [Audio Output] wcaps 0x11: Stereo
       Control: name="Front Playback Volume", index=0, device=0
             ControlAmp: chs=3, dir=Out, idx=0, ofs=0
       Device: name="ALC892 Analog", type="Audio", device=0
       Converter: stream=5, channel=0
       PCM:
              rates [0x5f0]: 32000 44100 48000 88200 96000 192000
              bits [0xe]: 16 20 24
              formats [0x1]: PCM
       Power states: D0 D1 D2 D3 EPSS
       Power: setting=D0, actual=D0
 
  # debugfs (CONFIG_DEBUG_FS 필요)
  $ sudo cat /sys/kernel/debug/asound/card0/pcm0p/sub0/xrun_debug
  0
 
  # XRUN 디버그 활성화
  $ echo 1 | sudo tee /sys/kernel/debug/asound/card0/pcm0p/sub0/xrun_debug
  $ dmesg | tail
  [12345.678] ALSA: PCM: [Q] Lost interrupts?: (stream=0, delta=128, new_hw_ptr=256, old_hw_ptr=128)
 

 

 

  18.3  커널 디버깅

 

 
  # CONFIG_SND_DEBUG, CONFIG_SND_VERBOSE_PRINTK 활성화 후 커널 빌드
 
  # Dynamic debug (runtime)
  $ echo 'module snd_hda_intel +p' | sudo tee /sys/kernel/debug/dynamic_debug/control
  $ echo 'file sound/pci/hda/* +p' | sudo tee /sys/kernel/debug/dynamic_debug/control
 
  # ftrace로 ALSA 함수 추적
  $ sudo su
  # cd /sys/kernel/debug/tracing
  # echo function_graph > current_tracer
  # echo snd_pcm_* > set_ftrace_filter
  # echo 1 > tracing_on
  # cat trace_pipe
         aplay-1234 [002] .... 1234.567: snd_pcm_open() {
         aplay-1234 [002] .... 1234.568: snd_pcm_open_substream() {
         aplay-1234 [002] .... 1234.569: snd_pcm_attach_substream() {
         aplay-1234 [002] .... 1234.570: azx_pcm_open() {
  . . .
 

 

 

  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