PNG 【GEGL, babl】
GIMPでPNGを開くとmacOSで
クラッシュした

macOS上でGIMP 3.0系を使っていたところ、PNGファイルを開こうとすると突然クラッシュする現象に遭遇しました。
特定のPNGだけでなく、ほぼどのPNGでも同じです。エラーダイアログは出ず、macOSのクラッシュレポートだけが残ります。

<svg class="eyecatch-svg" viewBox="0 0 192 192" xmlns="http://www.w3.org/2000/svg">
  <!-- 背景 -->
  <rect width="192" height="192" fill="white" rx="32" ry="32"/>
  
  <!-- 画像ファイルアイコン(中央) -->
  <g transform="translate(96, 96)">
    <!-- ファイル本体 -->
    <rect x="-32" y="-40" width="64" height="80" fill="#E0E0E0" rx="4" ry="4" stroke="#607D8B" stroke-width="3"/>
    
    <!-- ファイル折り返し -->
    <path d="M 20,-40 L 32,-40 L 32,-28 L 20,-40" fill="#9E9E9E" stroke="#607D8B" stroke-width="2" stroke-linejoin="round"/>
    
    <!-- 画像プレビュー領域 -->
    <rect x="-24" y="-28" width="48" height="36" fill="white" rx="2" ry="2"/>
    
    <!-- 山のシルエット -->
    <path d="M -24,-4 L -12,-20 L 0,-8 L 12,-24 L 24,-4 L 24,8 L -24,8 Z" fill="#2196F3"/>
    
    <!-- 太陽 -->
    <circle cx="-12" cy="-18" r="5" fill="#FF9800"/>
    
    <!-- PNGテキスト -->
    <text x="0" y="32" font-family="Arial, sans-serif" font-size="14" font-weight="bold" fill="#607D8B" text-anchor="middle">PNG</text>
  </g>
  
  <!-- 警告マーク(右上) -->
  <g transform="translate(140, 52)">
    <circle cx="0" cy="0" r="20" fill="#F44336"/>
    <path d="M -2,-8 L 2,-8 L 2,2 L -2,2 Z" fill="white"/>
    <circle cx="0" cy="8" r="2" fill="white"/>
  </g>
  
  <!-- 設定ギア(左下) -->
  <g transform="translate(52, 140)">
    <circle cx="0" cy="0" r="18" fill="#4CAF50"/>
    <circle cx="0" cy="0" r="10" fill="white"/>
    <rect x="-3" y="-20" width="6" height="8" fill="#4CAF50" rx="2" ry="2"/>
    <rect x="-3" y="12" width="6" height="8" fill="#4CAF50" rx="2" ry="2"/>
    <rect x="12" y="-3" width="8" height="6" fill="#4CAF50" rx="2" ry="2"/>
    <rect x="-20" y="-3" width="8" height="6" fill="#4CAF50" rx="2" ry="2"/>
  </g>
</svg>【GEGL, babl】<br class="chiilabo-br is-on">GIMPでPNGを開くとmacOSで<br class="chiilabo-br is-on">クラッシュした

「PNGが壊れているのか」「GIMP 3.0はまだ不安定なのか」と考えつつ、原因を一つずつ切り分けることにしました。

関連記事

1. PNGそのものには問題はなさそう

まず疑ったのは、PNGファイル自体の問題です。
念のため、macOSのプレビューアプリで同じPNGを開いてみましたが、問題なく表示できます。

また、sips コマンドでPNGを再エンコードしても、GIMPでは同じようにクラッシュしました。
この時点で「PNGデータそのものが原因ではなさそうだ」と考えました。

1.1. クラッシュログを確認する

次に、macOSが生成したクラッシュログを詳しく読みました。
例外は EXC_BAD_ACCESS (SIGBUS)
不正なメモリアクセスです。

クラッシュログを確認 macOS ログ EXC_BAD_ACCESS (SIGBUS) • 不正なメモリアクセス • Thread 6 (async) • GEGL / babl 関与

注目したのは、クラッシュしたスレッドが Thread 6 (async) だった点でした。
さらにスタックトレースを見ると、GEGLbabl といった、GIMP内部の画像処理ライブラリが並んでいます。

Thread 6 Crashed:: async
0   libsystem_pthread.dylib       	    0x7ff805e4faff 0x7ff805e4e000 + 6911
1   libbabl-0.1.0.dylib           	       0x101885400 babl_fish_path_process + 179 (babl-fish-path.c:1332)
2   libbabl-0.1.0.dylib           	       0x10188683c babl_process_rows + 180 (babl-fish-path.c:1451)
3   libgegl-0.4.0.dylib           	       0x1017a41f2 gegl_downscale_2x2_generic2 + 326 (gegl-algorithms.c:1168)
4   libgegl-0.4.0.dylib           	       0x1017b56f6 gegl_buffer_read_at_level + 465 (gegl-buffer-access.c:1730)
5   libgegl-0.4.0.dylib           	       0x1017b562e gegl_buffer_read_at_level + 265 (gegl-buffer-access.c:1713)
6   libgegl-0.4.0.dylib           	       0x1017b562e gegl_buffer_read_at_level + 265 (gegl-buffer-access.c:1713)
7   libgegl-0.4.0.dylib           	       0x1017b562e gegl_buffer_read_at_level + 265 (gegl-buffer-access.c:1713)
8   libgegl-0.4.0.dylib           	       0x1017b562e gegl_buffer_read_at_level + 265 (gegl-buffer-access.c:1713)
9   libgegl-0.4.0.dylib           	       0x1017b53d6 gegl_buffer_iterate_read_fringed + 301 (gegl-buffer-access.c:1779)
10  libgegl-0.4.0.dylib           	       0x1017b3df0 gegl_buffer_iterate_read_abyss_clamp + 34 (gegl-buffer-access.c:1459) [inlined]
11  libgegl-0.4.0.dylib           	       0x1017b3df0 gegl_buffer_iterate_read_dispatch + 1268 (gegl-buffer-access.c:1903)
12  libgegl-0.4.0.dylib           	       0x1017b0d42 _gegl_buffer_get_unlocked + 2334 (gegl-buffer-access.c:2244)
13  gimp                          	       0x10025f085 gimp_drawable_get_sub_preview_async_func + 355 (gimpdrawable-preview.c:391)
14  gimp                          	       0x10021f0ea gimp_parallel_run_async_execute_task(GimpParallelRunAsyncTask*) + 41 (gimp-parallel.cc:463)
15  gimp                          	       0x10021f269 gimp_parallel_run_async_thread_func(GimpParallelRunAsyncThread*) + 94 (gimp-parallel.cc:357)
16  libglib-2.0.0.dylib           	       0x10169bd8e g_thread_proxy + 66 (gthread.c:831)
17  libsystem_pthread.dylib       	    0x7ff805e5411f 0x7ff805e4e000 + 24863
18  libsystem_pthread.dylib       	    0x7ff805e4fac3 0x7ff805e4e000 + 6851Code language: CSS (css)

1.2. GEGLとbabl

GIMPでは、GEGLが画像処理の流れを管理し、その途中で必要な色変換をbablが担当します。

GEGL と babl GEGL Generic Graphics Library • 画像処理エンジン • パイプライン管理 • 拡大・縮小・合成 babl Because a pixel is not a pixel • 色形式変換 • 色空間変換 • RGBA → 他形式 連携
  • GEGL(Generic Graphics Library)は、
    GIMP内部で使われている画像処理用のエンジンです。
    画像の拡大・縮小、ぼかし、合成などの処理を、処理手順のパイプラインとして実行します。
  • babl(Because a pixel is not a pixel)は、
    ピクセルの色形式や色空間を変換するためのライブラリです。
    たとえば「RGBAの8bit画像を別の色空間に変換する」といった役割を担います。

2. プレビュー生成が怪しいと考えた理由

ここで重要なのは、画像を「開く」処理ではなく、「プレビューを作る」処理が非同期で動いていた ことです。

プレビュー生成が原因 1 PNG選択 2 非同期処理 3 プレビュー 生成 クラッシュ 処理内容 • 画像縮小(ダウンスケール) • 色変換(babl経由)

スタックトレースには、次のような流れが見えました。

  • 画像の一部を取得する処理
  • 縮小(ダウンスケール)処理
  • 色変換処理

これらは、キャンバス表示というより、サムネイルやプレビュー画像を作るとき に使われる処理です。

「もしかして、PNGを選択した瞬間に走るプレビュー生成で落ちているのでは?」
そう考えるようになりました。

2.1. ユーザーインターフェースのプレビュー設定をオフにする

そこで、GIMPの設定を実際に操作しながら確認することにしました。
目を向けたのが、ユーザーインターフェースのプレビュー設定 です。

解決策 編集 → 設定 → ユーザーインターフェース 「プレビュー」設定をオフにする 変更前 プレビュー ON ✕ クラッシュ 変更後 プレビュー OFF 正常動作

この設定を変更した直後、PNGを開いても クラッシュしなくなりました

2.1. ユーザーインターフェースのプレビュー設定をオフにする
  1. GIMPのメニューから「編集 → 設定」を開く
  2. 左側で「ユーザーインターフェース」を選ぶ
  3. 「プレビュー」関連の設定を確認
  4. レイヤーやチャンネルのプレビュー表示をオフにする

3. なぜこれで直ったのか(考察)

今回のクラッシュは、PNGを読み込む処理そのものではありませんでした。
PNGを選択したときに走る 非同期のプレビュー生成処理 が原因だったと考えています。

プレビューは、画像を縮小し、色変換し、表示用の小さな画像を作ります。
この処理がGEGLとbablを経由して深く呼び出され、結果としてスタックが壊れ、クラッシュしていたようです。

プレビューをオフにすると、その経路自体が実行されません。
そのため、問題が表に出なくなりました。

3.1. 限界と注意点

今回の方法は「根本的な修正」ではありません。
GIMP側の不具合を、設定で回避しているだけです。

また、プレビューをオフにすると、レイヤー一覧などが少し見づらくなります。
利便性と安定性のトレードオフはあります。

それでも、作業中に突然落ちるよりは、ずっと実用的です。

4. 設定が原因のクラッシュもある

今回の件で感じたのは、「ファイル形式の問題」に見えても、実際は UIやプレビュー処理が原因 というケースがあることです。

同じようにGIMP 3.0系でPNGクラッシュに悩んでいる方がいたら、
まずプレビュー設定を疑ってみる価値はあります。