핵심 요약
- 생물정보학 연구를 위해 10만 개 이상의 단백질 데이터를 처리하고자 옛 도구(netNGlyc)를 로컬에서 실행하려다 세그멘테이션 오류가 발생했습니다.
- 원인을 추적해보니 1996년 리눅스 2.0.0 시절에 컴파일되고 심볼 테이블까지 날아간 32비트 고대 바이너리가 범인이었습니다.
- 개발자는 strace와 시스템 콜을 뜯어보며 표준 입력과 쉘 스크립트 파이프라인을 파헤치는 극한의 디버깅을 시작했습니다.
요약 생물정보학(Bioinformatics) 연구실에서 단백질 기능 분석을 연구하는 한 개발자가 겪은 눈물겨운 1990년대 레거시 소프트웨어 디버깅 일화가 화제를 모았습니다. 작성자의 연구실에서는 단백질의 N-글리코실화 부위를 예측하는 구형 도구인 'netNGlyc'와 벤치마크 테스트를 진행해야 했습니다. 하지만 웹 버전(CGI 기반)은 하루 100여 개 정도의 단백질만 처리할 수 있어, 10만 개 이상의 데이터를 돌려야 했던 연구팀은 프로그램을 로컬 환경에서 직접 구동하기로 결정했습니다.
그러나 학계용 레거시 소프트웨어답게 문서는 전무하다시피 했고, 코드는 Perl, awk, tcsh, 심지어 포트란(Fortran)까지 온갖 언어가 뒤섞인 혼돈의 결정체였습니다. 압축을 풀고 tcsh 스크립트의 경로를 수정한 뒤 테스트를 실행하자마자 프로그램은 곧바로 '세그멘테이션 오류(Segmentation fault)'를 뿜어내며 뻗어버렸습니다.
작성자는 커널 로그(`dmesg`)와 리눅스의 시스템 콜 추적 도구인 `strace -f`를 활용해 오류를 추적했습니다. SIGSEGV 시그널을 확인하고 프로세스 ID를 추적한 끝에 범인이 `how98_Linux`라는 실행 파일임을 밝혀냈습니다. 하지만 파일 정보를 확인해 보니 1996년 리눅스 2.0.0 ABI 기반으로 컴파일된 32비트 정적 링크 바이너리였으며, 디버깅 심볼(symbol table)조차 완전히 제거(stripped)된 상태였습니다. 결국 작성자는 표준 입력(stdin)과 파이프라인으로 연결된 awk, tcsh 스크립트 및 메모리 동작을 하나하나 파헤치며 극한의 리버스 엔지니어링 디버깅에 돌입하게 됩니다.
Sponsored · 광고