← 목록
기타 2026-07-31 3KB 읽기 3분

T143 — 의미어라우터(9793) 핸들상한 크래시 수리

개요

의미어라우터서버.한선(:9793, plist org.crowny.의미어라우터)이 FREADALL 완독 이후 대형 모델(2.8MB, 46074줄 psv) 로드 시 문자열 핸들 상한(480,000) 초과로 exit43 크래시 루프에 빠져 있었다. 로더를 핸들효율 구조로 재작성해 완독 기동시켰다.

원인

모델로드()가 각 줄을 포함()+부분()으로 체인 파싱(줄→r1→r2→r3, h1→h2→h3 등 서브스트링의 서브스트링을 반복 생성)하면서 실제 보관에 필요한 문자열 외에 파싱 중간산물 문자열 핸들을 라인당 5~9개씩 추가로 생성. L태그(27458줄)+F태그 (18574줄) 합 46032줄 × 평균 6~7개 중간핸들 ≈ 30만+ 낭비 핸들이 GC 후에도 스코프 내 생존, 480,000 상한을 넘겨 exit43 루프.

수리

/Users/ef/crowny-butler/libs/의미어라우터_코어.한선모델로드()를 버퍼 오프셋 기반 파싱으로 재작성:
  • 줄을 문자열로 뜨지 않고 버퍼바이트읽기()로 파이프(|) 위치를 오프셋 인덱스만으로 스캔
  • 각 필드를 버퍼읽기(버퍼, 오프셋, 길이) 1회로 직접 추출(체인 부분() 제거)
  • 태그 판별도 문자열 비교 대신 버퍼바이트읽기() 바이트 비교(P=80,C=67,F=70,L=76,
L의 2번째 글자 P/F=80/70)로 서브스트링 생성 자체를 회피

부수 발견: hanseonc_high.c의 STRICT 아리티 테이블에 버퍼읽기가 2인자로 잘못 등록되어(실제 VM BUF_READ는 3인자: buf,offset,length — crownyc.c:10551) STRICT 컴파일 시 거짓 경고 15건 발생. 테이블을 3인자로 수정(사전부터 존재하던 버그, 원 코드도 3인자로 호출하고 있었음).

검증

  • CROWNY_STRICT=1 ./hanseonc_high 의미어라우터서버.한선 → 0경고
  • 격리 기동(crownyc run 직접 실행) → 핸들 경고 없이 로드: 7567 cubes 1회 출력
  • 라이브 교체: /Users/ef/crowny-butler/libs/의미어라우터서버.toau
(구버전 .toau.bak-핸들상한전-T143로 백업)
  • launchctl kickstart -k gui/$(id -u)/org.crowny.의미어라우터 → PID 91492,
36초+ 생존, [STR]/[VM] 경고 재발 없음
  • 9793 라이브 응답 5회 연속 정상 (완료-보고|완료→보고(결과)|세분|21|...)

관련 파일

  • /Users/ef/crowny-butler/libs/의미어라우터_코어.한선 (모델로드 재작성)
  • /Users/ef/crowny-butler/libs/의미어라우터서버.toau (재컴파일 배포)
  • /Users/ef/crowny-butler/libs/의미어라우터서버.toau.bak-핸들상한전-T143 (롤백용 백업)
  • /Users/ef/CrownyOS/crownyc/hanseonc_high.c (버퍼읽기 아리티 3인자 수정)
  • 로그: /tmp/라우터서버.err

잔여 이슈

  • 방사형이웃.psv 로더(같은 함수 하단)는 여전히 글자() per-char 순회지만
파일이 597바이트로 극소(19줄)라 이번 크래시의 원인이 아니었음 — 손대지 않음. 추후 대용량화되면 동일 버퍼 오프셋 패턴으로 전환 권장.
  • STRICT 아리티표에 유사한 스테일 항목이 더 있을 수 있음(전수 감사 안 함).