Active Perl で binmode STDERR, “:encoding(cp932)”; 後の dieでフリーズ
windows上で、perlのスクリプトを書いているときに、コマンドプロンプトで実行後、die のタイミングで応答が無くなって、CPUを食いまくっててctrl-c も効かず、タスクマネージャでperlのプロセスを落とさざるをえなくなる状況がありました。
その時は、binmode STDERR, “:encoding(cp932)”;をコメントアウトしたら現象が収まったので、それで切り抜けました。
windows active perlで、binmode STDERR, ":encoding(cp932)"; して、dieしたら、応答しなくなった。
— smeghead (@smeghead) September 21, 2018
そしたら、@lemorin_jp さんが再現しようとしてくれました。
初めまして。症状に興味があったので挑戦したところ、「cp932」の綴りを間違えると再現いたしましたので参考まで。
エラー出力が出ない – Perl – ルモーリン https://t.co/NxCW5XTxSV— ルモーリン (@lemorin_jp) September 22, 2018
確認したところ、スペルミスではなかったですが、
反応していただいたからには、俺もちゃんと調べないといけないなと思い、調査しました。
### 環境 ###
– 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 |
× |
なんか、秘孔ついちゃったような動作なので、他の方も再現するようなら公式に報告すべきかもです。
試してもらえたら結果を教えてほしいです。