ChromeのJSデバッガでブレークしない

Google ChromeのJavaScriptデバッガは本当に優秀でとっても便利なので常用しています。しかし、あるjsファイルでだけ意図した動作をしないという現象に遭遇しました。Chromeのバージョンは36。

  • ブレークポイントを貼ってもその箇所で止まってくれない
  • 特定の.jsファイル以外のファイルに記述されたコードでは正しく動作している
  • 問題が発生する.jsファイル以外のファイルに記述されたコードから、問題が発生する.jsファイルの内部で定義されたメソッドに対してステップイン実行すると、必ず1行目に飛ぶ
  • 問題が発生する.jsファイルの1行目(今回のファイルはコメントだった)にブレークポイントを貼るとなぜかブレークする

という感じです。最後のあたりで気付いた人ももしかしたら居るかもしれませんが、原因は改行コードでした。

問題の発生するファイルのみ改行コードがCRでその他のファイルはすべてCR+LFになっていました。Chromeのコードビュー上もちゃんと改行されているので気づかなかったのですが、ChromeのJSデバッガから見るとCR改行コードは認識できないらしく、すべてのコードが1行になって見えていたというわけですね。

以前は見れていたような気がするんですけどね・・・。確証はないですが。

ちっちゃいことですが困っている人がいるかもしれないと思い、書いてみました。

余談

CRはcarriage return、LFはLine Feedの略です。元々、CR+LFという改行コードを定義したのはテレックス(テレタイプ)用のボーコードでした。これは1905年に発表され、1929年に国際電信アルファベットITA1, ITA2(International Telegraph Alphabet No.1およびNo.2)として承認されたそうです。

CRはタイプライタのキャリッジ(紙を左右に動かす装置)を左端に戻す動作、LFは行を一行ずらす操作でしたので、この二つを組み合わせることで改行を指示するコードとしていました。

で、ボーコードはASCIIに受け継がれ、CRとLFは現代でも生き残っているわけです。しかし、こんなもんはエディタを開いていても見えないです。普通にPCを使っていて意識するケースはほとんどないでしょう。プログラムを書いていると、これに加えてエスケープシーケンスとして\r(CR)と\n(LF)が存在して、言語や環境によっては\nを適宜CR+LF、LF、CRに置き換えてくれたり、置き換えてくれなかったりするものが混在しているのでさらに理解が難しいです。

現代ではCRとLFを明確に区別しなければならないケースというのは多分無いような気がします。よって、理想論を言えばどちらか一方(たぶんLF)に統一すべきなのだと思います。

しかしながら、Windows環境やHTTPの仕様ではCR+LFとなっていたりしますので、これを修正するとなるとかなりしんどいことになります。

従いまして、プログラマの皆さんにおかれましては、今後も数十年のスパンに渡ってCRとLFとは付き合っていかなくてはならないことが容易に想像されるのですけれども、C#なんかではEnvironment.NewLineとかいう長ったらしい定数も定義されていることですし、writeLineなどといった改行コード込みの出力メソッドを合わせて定義しているライブラリ・言語も多くなってきましたし、「100年以上前のことでなんでこんなに悩まなきゃいけないんだ」とキーボードでディスプレイをかち割る前に、まずは冷静になっていただいてCRとLFとうまく付き合ってやって頂けたらと思う次第でございます。