Active Perl で binmode STDERR, “:encoding(cp932)”; 後の dieでフリーズ

windows上で、perlのスクリプトを書いているときに、コマンドプロンプトで実行後、die のタイミングで応答が無くなって、CPUを食いまくっててctrl-c も効かず、タスクマネージャでperlのプロセスを落とさざるをえなくなる状況がありました。
その時は、binmode STDERR, “:encoding(cp932)”;をコメントアウトしたら現象が収まったので、それで切り抜けました。

そしたら、@lemorin_jp さんが再現しようとしてくれました。

確認したところ、スペルミスではなかったですが、
反応していただいたからには、俺もちゃんと調べないといけないなと思い、調査しました。

### 環境 ###

– OS: Windows Server 2012
– perl: 5.024001

### 再現方法 ###

最短の再現方法を突き止めるまで、かなり試行錯誤しましたが、どうやら、パスにある程度の長さの日本語フォルダ名が含まれることが必要だったようです。

#### 1. Cドライブ直下に、「ああああああ」という名前のフォルダを作成する。C:\ああああああ

#### 2. c:\ああああああ に freeze.pl スクリプトを作成する。

binmode STDERR, ":encoding(cp932)";
printf "Perl: %s\n", $];
die;

#### 3. コマンドプロンプトで、スクリプトを実行する。

C:\> perl c:\ああああああ\freeze.pl
Perl: 5.024001

#### 4. コマンドプロンプトで、終了もせず、Ctrl-c も効かず、CPU使用率が上がったままの状態となる。

以下は、スクリプトの配置パスが影響しているようで、複数のパスで再現テストをした結果です。

パス 再現
C:\ああああああ\freeze.pl ○
C:\あああああ\freeze.pl ×
C:\Users\Administrator\Documents\あああああ\freeze.pl ○
C:\Users\Administrator\Documents\かきくけこ\freeze.pl ×
C:\Users\Administrator\Documents\aaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaa\freeze.pl
×

なんか、秘孔ついちゃったような動作なので、他の方も再現するようなら公式に報告すべきかもです。
試してもらえたら結果を教えてほしいです。

コメントする

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。