19.8.1. listener 명령어를 이용한 실시간 데이터 검사
비행 현장에서 내 센서 데몬이나 항법 알고리즘이 수상하게 동작할 때, C++ 코드를 황급히 열람하거나 소스코드에 지저분한 printf 디버깅 텍스트를 쑤셔 넣기 위해 펌웨어를 재컴파일하는 것은 가장 무능한 3류 개발자들의 방식이다.
픽스호크 NSH 콘솔 창에는 시스템 전역에 깔려있는 수천 개의 uORB 링 버퍼 파이프라인 중 당신이 원하는 파이프의 뚜껑만 강제로 열어젖혀, 그 안으로 흘러 들어가는 핏물 같은 생짜 struct 데이터 조각들을 터미널 텍스트 화면에 쌩얼굴 그대로 복사 덤프해 주는 절대적인 도청(Wiretapping) X-Ray 명령어가 존재한다.
그것이 바로 listener 유틸리티이다.
1. listener: VFS 파이프라인의 강제 뚜껑 열기
이 명령어의 사용법은 극도로 직관적이고 치명적이다. NSH 쉘 프롬프트(px4>)에서 단지 listener 뒤에 당신이 훔쳐보고 싶은 VFS 우체통(Topic)의 이름표 텍스트만 띄어쓰기로 던져주면 끝난다.
px4> listener sensor_test_data
이 명령어를 엔터 치는 찰나, 백그라운드에 숨어있던 listener 마스터 데몬이 기상하여 커널 VFS 시스템의 sensor_test_data 0번 방 트리에 스니핑(Sniffing) 호스를 강제로 꽂는다. 그리고 현재 링 버퍼 꼬리단에 고착되어 있는 가장 최신의 메인 스냅샷 데이터(Payload) 한 덩어리를 딥 카피(copy)해 들고 와서, 그 구조체 내부의 모든 멤버 변수 필드들을 예쁜 콘솔 텍스트 트리 형태로 강제 덤프(Dump) 출력해 낸다.
2. NSH 쉘 도청 시그널의 해부학
명령을 타격하면 터미널 창에 아래와 같은 극도로 웅장한 해부학 결과물이 폭포수처럼 쏟아진다.
TOPIC: sensor_test_data
sensor_test_data_s
timestamp: 120445580 (0.012540 seconds ago)
temperature: 25.4021
error_count: 0
device_id: 134521
이 짧은 텍스트 덤프 덩어리 안에는 10년 차 시스템 아키텍트가 버그를 색출해 내는 핵심적인 2개의 메타데이터가 완벽하게 노출되어 있다.
- Payload (구조체 내용물) 검증: C++ 메모리 안에서
float오버플로우나 포인터 캐스팅 오류로 인해 데이터가 깨지지 않았는가를 직관적으로 심사한다. 만약 저기서temperature: NaN이나inf(무한대)가 찍혀 나왔다면, 퍼블리셔 데몬의 메모리 산술 연산에 치명적 결함이 터졌음을 단 1초 만에 논리적으로 확정 지을 수 있다. - 타임스탬프 생존(Freshness) 검증: 가장 살벌한 부분이다. 괄호 안에 찍힌 **
(0.012540 seconds ago)**라는 텍스트를 주목하라. 이 값은시스템 현재 시간 - 데이터 내부의 timestamp를 계산한, 즉 데이터의 ’신선도(Latency)’이다. 이 값이 수십 마이크로초(us)나 밀리초 내외라면 퍼블리셔가 맹렬히 살아서 피를 공급한다는 뜻이다. 하지만 여기서(4.502000 seconds ago)따위의 끔찍한 숫자가 찍혀 나온다면? 당신의 그 퍼블리셔 데몬은 4.5초 전에 락(Lock)이 걸렸거나 이미 데드락으로 인해 죽어버린 시체라는 것을 뼈저리게 통보받는 것이다.
3. 실무 현장의 무결성 투시 권력
실전 비행 랩(Lab) 현장에서 기체가 이륙 전 자꾸 아밍(Arming: 시동)을 거부하며 “Sensor Missing” 에러를 뱉는다면, 1급 엔지니어들은 당황하지 않고 텔레메트리 콘솔에 들어가 listener sensor_gps를 가장 먼저 타격한다. 센서 자체가 죽어 타임스탬프 갱신이 멈췄는지(seconds ago 지연 폭주), 혹은 센서는 살아있는데 내부 구조체의 GPS 픽스(Fix) 플래그만 0(No Lock)을 뿜고 반항하고 있는지를 이 명령어 한 방으로 즉시 분해해 내는 것이다.
하지만 이 listener 명령어는 기본적으로 0번 주(Main) 인스턴스 방만을 편식해서 노려보는 약점이 있다. 당신 기체에 달린 1번, 2번 예비 칩셋(다중 인스턴스)들의 혈압까지 노련하게 교차 투시하고 싶다면 어떻게 해야 하는가? 이어지는 19.8.1.1과 19.8.1.2 단원에서 이 listener 명령어의 파라미터를 극한까지 부려먹어 VFS 멀티플렉싱 심연을 텍스트로 폭파하는 방법을 다룰 것이다.