MenuIcon

Owl-Networks Archive

LoginIcon

Perl / PAR / Windows : creation of private temporary subdirectory ~ failed 문제

| 분류: Perl | 최초 작성: 2011-11-12 06:32:52 |

1. 문제의 발생


영미권에서 만들어진 프로그램들을 한글 윈도우 상에서 사용할 때에 종종 맞닥뜨리는 문제들은, 상당 부분 이 사람들이 도대체 한글이라는 것의 존재 자체를 계산에 넣지 않는다는 데에서 기인하곤 하는데, 오늘의 문제도 딱 그러하다.

며칠 전 Perl로 짠 어떤 스크립트를 PAR::Packer 를 이용하여 빌드하여 공개를 했다. 그리고 과거 버전에서와 마찬가지로, 이번 버전에서도 어김없이 몇몇 분들이 실행이 안 된다는 피드백을 주셨다. 프로그램이 뭔가 뜨자마자 바로 꺼져버린다는 것이다. 내 시스템에서는 도무지 재현이 안 되는 문제여서 과거에도 해결을 못 하고 넘어갔는데, 똑같은 문제가 계속 발생하자 나도 오기가 발동했다.



2. 삽질의 과정


일단 뭔가 단서가 있어야 했다. 실행되자마자 어떠한 오류 메시지도 없이 그냥 팍 꺼져버리는 것으로 보아, 아마도 PAR::Packer 가 코드의 압축을 푸는 과정에서 문제가 생기는 것으로 추정되었다. (즉 기존의 코드나 라이브러리 문제는 아닌 것으로 판단되었다. 만약 그렇다면 오류 메시지가 떠야 할 테니까.)

바로 피드백 주신 분께 콘솔창이 출력되는 테스트용 프로그램을 보내드린 후, 실행 중 출력되는 오류 메시지가 있는지를 확인해 달라고 부탁드렸다. 아니나 다를까. 출력되는 메시지가 있었는데, 그것은 바로 다음과 같은 메시지였다.

creation of private temporary subdirectory c:\docume~1\ddd\locals~1\temp\par-_ㅐ??temp-2252 failed - aborting with 22.

creationof.png


어디서 문제가 발생하는지 일단은 확실해졌다. 기술 문서에 의하면, PAR::Packer 는 실행되면서 소스 코드 및 라이브러리를 사용자 임시 폴더 이하에 풀어놓은 후 이를 해석하여 실행한다. (기본적으로 Perl은 인터프리터 언어이다.) 이 때, 임시 폴더의 이름은 TEMP이하에 "par-사용자 이름"으로 정해지며, 다시 그 밑에 "Temp-......" (......는 영문자/숫자로 구성된 임의의 긴 문자열) 폴더를 만들고 그 아래에 코드들이 복사가 된다. (PAR로 빌드된 여러 개의 프로그램을 돌릴 때 우연히 파일이 겹치지 않도록 하기 위해서 개별 프로그램별로 Temp-...... 라는 임의의 폴더를 더 만드는 것이다.) 정리하면 이런 구조가 된다. (윈도우 XP의 경우)

C:\Documents and Settings\UserName\Local Settings\Temp\par-UserName\Temp-.........


결국 위 오류 메시지는 결국 코드를 풀어놓기 위한 저 폴더를 못 만들고 있다는 이야기가 된다. 응? 왜?! 공용 임시 폴더도 아닌 개인 임시 폴더에 쓰기 권한이 없을리는 없고..

이해가 안 되어서 신나게 구글링을 돌려 보았지만, 정확히 이것과 맞아 떨어지는 문서는 발견되지 않았다. 아니 이런 오류와 관련된 문서 자체가 없었다. 그러다가 오류 메시지 중간에 뭔가 글씨가 깨진 것이 눈에 들어왔다. 혹시 오타가 아닌가 싶었지만, 출력되는 그대로 쓴 것이라고 했다. 설마?

바로 여쭤보았다. 혹시 윈도우에서 사용자 이름을 한글로 쓰고 계시진 않으신가요? 그렇다는 답이 돌아왔다. 바로 가상머신에 XP를 켜고 한글 사용자 이름을 사용하는 계정을 만든 후 프로그램을 돌려 보았다. 빙고!



3. 문제의 원인


문제는 PAR::Packer 가, 실행 코드를 풀어놓기 위한 폴더를 만드는 과정에서 한글로 된 사용자 이름을 (인코딩 생각 안 하고) 그대로 밀어넣는 데 있었다.

(1) 영문자만으로 이루어진 ASCII 인코딩 사이에 보통 CP949로 되어 있을 한글 문자를 무리하게 밀어넣어 폴더 경로를 만들었고,

(2) 폴더 경로를 처리하는 과정에서 한글을 고려하지 않고 (모두 1바이트 문자로 간주하여) 정상적인 문자 범위를 벗어나는 문자들을 모두 _로 변환한 결과,

(3) 2바이트인 한글 문자의 일부가 _로 변경되면서 나머지 부분이 깨진 문자로 바뀌고, 이런 깨진 문자들은 폴더 이름으로 사용할 수 없는 문자들이어서,

(4) 이 경로로 폴더를 만들려는 시도에 윈도우는 당연히 폴더를 만들 수 없다는 오류로 대응.

대략 이런 그림이 그려진다.



4. 해결 방법 (2012/03/27 수정)


그렇다면 해결 방법은? 현재 이 문제는 한국 Perl 커뮤니티에 의해 제작자에게 리포팅 되었고, 그 결과 2012년 2월에 발표된 PAR::Packer 1.013 버전에서는 이 문제가 해결되었다. 즉, 이 문제 해결을 위해서는 PAR::Packer(필요하다면 PAR 까지)를 최신 버전으로 업그레이드하면 된다.

만약 PAR::Packer 를 업그레이드할 수 없는 이유가 있다면, 필요한 부분을 C 소스 레벨에서 직접 수정한 후 PAR::Packer 를 다시 컴파일하여 사용할 수도 있다. 자세한 내용은 필자의 다음 글을 참조하면 된다.

[[LINK::410]]

그러나, 지금 이 글을 읽는 독자가 Perl 개발자가 아닌 프로그램 사용자일 뿐이라면, 이 문제를 해결하기 위해서는 그 프로그램 제작자에게 부탁하여 새로운 PAR::Packer 버전을 사용한 실행 바이너리를 얻거나, 자신의 윈도우 사용자 이름을 영문과 숫자만의 문자열을 사용하여 다시 만드는 수밖에 없다. 이름 변경만으로는 해결되지 않고, 반드시 새로운 계정을 만들어야 한다. (레지스트리의 관련 항목을 함께 수정하면 되기는 할 텐데, 이것이 시스템에 다른 영향을 주지 않으리라고 장담할 수가 없다.)



5. 결론


PAR::Packer 버전 1.012 또는 그 이전 버전으로 빌드된 Perl 스크립트는 윈도우 환경에서 사용자 이름에 한글이 포함되어 있을 경우 실행되지 않는다. 사용자의 입장에서 이 문제를 해결하기 위해서는 만약 이런 경우, 영문+숫자로 이루어진 "새로운" 사용자 계정을 생성하여 그 계정으로 로그인 후 실행해야 하며, 기존의 한글이 포함된 이름을 변경한다고 하여 해결되지 않는다.

☞ 태그: 한글, 사용자 이름, 임시 폴더, PAR::Packer, PAR,

☞ 트랙백 접수 모듈이 설치되지 않았습니다.

☞ 덧글이 없고, 트랙백이 없습니다.

덧글을 남기시려면 여기를 클릭하십시오.
[483] < [408] [407] [406] [405] [403] ... [402] ... [400] [398] [394] [392] [391] > [19]

(C) 2000-2018, Owl-Networks. Powered by Perl. 이 페이지는 HTML 5 표준에 따라 작성되었습니다.