Files, Binary & Compression

ソースマップ解析圧縮後の行と列から元のコードへ

.mapファイル(またはインラインmap付きのJS)を貼り付け、行:列かスタックトレースを入力すると、元のファイル・行番号・コードが表示されます。

ソースマップ解析ツール

サンプル:

ソースマップ

このタブ内で解析します。リモートのソースや外部のsourceMappingURLは取得しません。

結果

入力が変わりました。自動で解析します…

本番のエラー監視に「app.3f2a.js:1:20931」とだけ出ている。圧縮されたバンドルの1行目、2万列目です。一緒にビルドされた.mapファイルには、それが元のどの.tsや.vueの何行目かが書かれていますが、mappingsはBase64 VLQで符号化されていて目では読めません。このソースマップ解析ツールがデコードと検索を代わりに行うので、エラー1件のためにsource-mapライブラリを入れたスクリプトを書く必要はありません。

エラー監視にソースマップをアップロードしていないとき、CIの成果物しか手元にないとき、あるいはmapが本番のバンドルと同じビルドのものか確認したいときに使えます。ファイル自体の確認にも向いています。sourcesに何が並び、どれがsourcesContentを持ち、どれがignoreListに入っていて、mappingsが壊れていないか。サーバーにmapを送って解析するサービスと違い、何もアップロードせず、リモートのURLにも一切アクセスしません。

このソースマップ解析ツールを使う理由

知りたいのは「元のコードの何行目か」。スタックトレース全体をまとめて調べ、結果が近似のときはそう表示します。

スタックトレースをまるごと貼って全フレームを逆引き

:行:列で終わる行はすべてmapで検索され、元のファイル・行番号・列番号・元の変数名と前後数行のコードが表示されます。mapのfileと違うファイルのフレームには警告が付くので、vendorバンドルのフレームをアプリのmapで誤って解決することはありません。

左に圧縮後のスタックトレース、右に各フレームを元のTypeScriptファイルと行番号に解決した結果と、該当するコード行の強調表示。

mapに含まれるソースを確認し、復元する

「ソース」ビューはsourcesの各エントリーをsourceRoot適用後のパスで一覧し、sourcesContentの有無とignoreListかどうかを示し、行番号付きでコードを表示します。1ファイルずつ保存するほか、埋め込まれた全ソースをフォルダ構成のままzipで保存でき、sourcesContent復元の手段になります。

mapから読み取ったソースファイル一覧(一部はコードなしの印付き)と、行番号付きで復元されたTypeScriptファイル、zipダウンロードボタン。

位置を正しく特定するための3つのポイント

01

mapはどんな形でも渡せる

.mapのJSONを貼る、「.mapファイルを開く」かドロップする、あるいはビルド後のJS/CSSファイルそのものを貼っても構いません。末尾に//# sourceMappingURL=data:…があれば、インラインmapを取り出してデコードします(Base64とURLエンコードの両方に対応)。通常のURLを指している場合はURLを表示するだけで取得しないので、その.mapファイルを直接開いてください。

  • サーバーの応答をそのまま保存したmapにありがちな先頭の)]}'行やUTF-8のBOMは自動で取り除きます。
02

列番号が0始まりか1始まりかを確認する

位置は12:345、「12 345」、またはat n (https://example.com/app.js:1:177)のようなフレームそのままでも入力できます。Chrome・Firefox・Nodeのスタックトレースに合わせ、列番号は既定で1から数えます。mozilla/source-mapの結果など0始まりの列番号を使うときは「列番号を1から数える」をオフにしてください。そうしないと結果が1文字ずれます。

  • エラーメッセージの行など行:列を含まない行はスキップして件数だけ表示し、検索全体は失敗させません。
03

一致の種類を見てから逆方向にもたどる

「完全一致」はその列からセグメントが始まっていることを意味します。そうでなければ左側で最も近いセグメントを使い、その旨を表示します。これはブラウザやsource-mapライブラリの既定と同じ規則です。「ソースで表示」を押すと元の行に移動し、元の行番号欄がその行に対応する生成位置をすべて逆引きします。

  • 自動解析をオフにしている場合は、パネル内のどこでもCtrl/Cmd+Enterで解析と検索を実行できます。

mapから読み取れるもの

すべてのマッピングをデコード

「マッピング」ビューはVLQ文字列を「生成行:列 → ソース・元の行:列・名前」の行に分解して100件ずつ表示し、全件をTSVで書き出せます。表計算ソフトやdiffでの比較に使えます。

元の行から生成コードを逆引き

ソースと元の行番号を選ぶと、そこを指す生成位置を一覧します。ある行がインライン化されたのか、複製されたのか、ミニファイで消えたのかを確かめられます。

インライン・インデックス・ignoreList

インラインのdata: URL、sectionsとoffsetを持つインデックスマップ、sourceRootの連結、ignoreListと旧来のx_google_ignoreListに対応し、フレームワークのコードと自分のコードを見分けられます。

壊れたセグメントを指し示すエラー

JSONの構文エラーは行と列で、不正なVLQ文字、フィールド数の合わないセグメント、範囲外のsourceやnameのインデックスは、生成コードの何行目の何番目のセグメントかで報告します。

できること・しないこと

リモートのものは一切取得しない
外部のsourceMappingURL、sources内のhttp(s)のアドレス、URLで参照するインデックスマップのセクションは表示するだけでリクエストしません。map、その中のソース、貼り付けたスタックトレースはこのタブの中だけに留まり、URLにもローカルストレージにも保存しません。
v3のみ・最大50 MB
受け付けるのはSource Map v3だけで、version 2やバージョンのないファイルはエラーになります。50 MBを超える入力は拒否し、非常に大きなmapではデコード中にページが一瞬止まることがあります。
近いセグメントは左側だけから選ぶ
その列から始まるセグメントがないときは左側で最も近いセグメントを使い、近似として表示します。バンドラーが生成したコードの中の列なら、近くの位置を推測せず、元の位置がないセグメントだと表示します。
sourcesContentがなければコードは出せない
sourcesContentなしでビルドされたmapでも元のファイルパスと行・列は分かりますが、コード片の表示・プレビュー・zip保存はできません。元のテキストがファイルに入っていないためです。
1つのmapは1つのバンドルだけ
mapが説明するのは自分のバンドルだけです。別ファイルのフレームは警告付きで検索するので、警告を確認してから結果を使ってください。セグメントごとの色分け表示、mapの編集や結合は対象外です。

ソースマップ解析のよくある質問

ソースマップを使って元のファイルを復元するには?

mapにsourcesContentが含まれていれば復元できます。このフィールドには各ソースファイルの全文が入っています。「ソース」ビューで1ファイルずつ表示・保存するか、全ファイルをフォルダ構成のままzipで保存してください。sourcesContentがないmapにはパスと位置しかなく、コードは復元できません。

sourcesContentがnullのとき、元のソースはどうやって確認できますか?

そのエントリーのコードはmapに含まれていないため、このツールでは「ソースなし」と表示されます。行番号と列番号、ファイルパスはmappingsとsourcesから分かるので、リポジトリの同じコミットを開いてその位置を確認するのが確実です。ビルド設定でsourcesContentを有効にすれば次回から埋め込まれます。

圧縮後の行と列から元の位置を求めるには?originalPositionForの代わりになりますか?

なります。位置欄に行:列かスタックトレースを貼ると、source-mapライブラリのoriginalPositionForと同じく左側で最も近いセグメントから元の位置を求めます。違いは列番号の数え方で、originalPositionForは0始まり、このツールは既定でスタックトレースと同じ1始まりです。

Source Mapのmappingsはどう読めばいいですか?

mappingsはセミコロンで生成コードの行を、カンマでセグメントを区切り、各セグメントは1・4・5個の値をBase64 VLQで符号化したものです。値は前のセグメントからの差分です。「マッピング」ビューでこれを行:列の対応表に展開したソースマップ解析の結果を確認できます。

本番にソースマップを置くとソースコードを見られてしまいますか?

見られます。公開されたmapにsourcesContentがあれば、誰でも元のコードとコメントを読めます。そのため多くのチームはmapをエラー監視サービスにだけアップロードするか、認証付きの場所に置いています。ここでの確認はすべてブラウザ内で完結し、貼り付けた内容は外部に送信されません。

解決しませんでしたか?

ソースマップ解析でエラー箇所を特定する

直近のビルドの.mapファイルをドロップし、バグ報告のスタックトレースを貼れば、元のコードの何行目かがすぐに分かります。ソースマップ解析はすべてブラウザ内で行われます。

処理はすべてブラウザ内のローカルで完結します。