47686


Ubuntu 18.04
の32bit環境でビルドしたプログラムを、32bitのライブラリを組み込んだ64bitの環境で動かそうとするとフリーズしてしまいます。  
コードは以下のようなもので、文字列の幅と高さを求めるようにしています。

[code]

    #include <stdio.h>
    #include <string.h>
    #include <pango/pangocairo.h>
    #include <glib/gprintf.h>
    
    int
    main(int argc, char *argv[])
    {
      cairo_surface_t *surface;
      cairo_t *cr;
      PangoLayout *layout;
      PangoFontDescription *fontDescr;
      cairo_font_options_t *fontOptions;
      PangoRectangle inkRect, logicalRect;
      int left, right, top, bottom, width, height;
    
      surface = cairo_image_surface_create(CAIRO_FORMAT_A8, 100, 100);
      cr = cairo_create(surface);
      layout = pango_cairo_create_layout(cr);
    
      fontOptions = cairo_font_options_create();
      cairo_font_options_set_hint_style(fontOptions, CAIRO_HINT_STYLE_DEFAULT);
      cairo_font_options_set_hint_metrics(fontOptions, CAIRO_HINT_METRICS_DEFAULT);
      cairo_font_options_set_antialias(fontOptions, CAIRO_ANTIALIAS_NONE);
      pango_cairo_context_set_font_options(pango_layout_get_context(layout), fontOptions);
    
      fontDescr = pango_font_description_from_string("DejaVu Sans, 18px");
      pango_layout_set_font_description(layout, fontDescr);
      pango_layout_set_text(layout, "test", 4);
    
      printf("checkpoint\n");
      pango_layout_get_pixel_extents(layout, &inkRect, &logicalRect);
      printf("ok\n");
    
      left = (inkRect.x < logicalRect.x) ? inkRect.x : logicalRect.x;
      top = (inkRect.y < logicalRect.y) ? inkRect.y : logicalRect.y;
      right = inkRect.x + inkRect.width;
      if ((logicalRect.x + logicalRect.width) > right) {
        right = logicalRect.x + logicalRect.width;
      }
      bottom = inkRect.y + inkRect.height;
      if ((logicalRect.y + logicalRect.height) > bottom) {
        bottom = logicalRect.y + logicalRect.height;
      }
      width = right - left;
      height = bottom - top;
    
      printf("w=%d, h=%d\n", width, height);
    }
    
[/code]

これをUbuntu 18.04の32bit環境で以下のようなスクリプトでビルドしています。

[code]

    gcc -Wall `pkg-config --cflags pangocairo` test2.c `pkg-config --libs pangocairo` -o test2
    
[/code]

32bit環境で実行すると、以下のような結果が表示されます。

[code]

    $ ./test2 
    checkpoint
    ok
    w=33, h=22
    $
    
[/code]

同じバイナリを32bitの各種ライブラリを組み込んだ状態の64bit環境で実行させると以下のようになってフリーズします。

[code]

    $ ./test2 
    checkpoint
    
[/code]

gdbで実行してトレースを出力させると以下のようになります。

[code]

    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
    checkpoint
    ^C
    Program received signal SIGINT, Interrupt.
    0xf787f952 in ?? () from /usr/lib/i386-linux-gnu/libfreetype.so.6
    (gdb) thread apply all backtrace
    
    Thread 1 (Thread 0xf73cba40 (LWP 5370)):
    #0  0xf787f952 in ?? () from /usr/lib/i386-linux-gnu/libfreetype.so.6
    #1  0xf787fe6b in FT_DivFix () from /usr/lib/i386-linux-gnu/libfreetype.so.6
    #2  0xf78a946a in ?? () from /usr/lib/i386-linux-gnu/libfreetype.so.6
    #3  0xf78a9b2b in ?? () from /usr/lib/i386-linux-gnu/libfreetype.so.6
    #4  0xf78ab7ef in ?? () from /usr/lib/i386-linux-gnu/libfreetype.so.6
    #5  0xf78ad6ff in ?? () from /usr/lib/i386-linux-gnu/libfreetype.so.6
    #6  0xf78ae28a in ?? () from /usr/lib/i386-linux-gnu/libfreetype.so.6
    #7  0xf7885062 in FT_Load_Glyph () from /usr/lib/i386-linux-gnu/libfreetype.so.6
    #8  0xf7a6196c in ?? () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #9  0xf7a61ada in ?? () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #10 0xf7a63aab in FcFreeTypeQueryFace () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #11 0xf7a5f34e in ?? () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #12 0xf7a5f81e in ?? () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #13 0xf7a5faa8 in ?? () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #14 0xf7a5a937 in ?? () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #15 0xf7a5a9f6 in FcConfigBuildFonts () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #16 0xf7a64bcf in ?? () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #17 0xf7a64bfa in FcInitLoadConfigAndFonts () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #18 0xf7a57ae6 in ?? () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #19 0xf7a59ec6 in FcConfigSubstituteWithPat () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #20 0xf7a59fb6 in FcConfigSubstitute () from /usr/lib/i386-linux-gnu/libfontconfig.so.1
    #21 0xf7fb07d3 in ?? () from /usr/lib/i386-linux-gnu/libpangocairo-1.0.so.0
    #22 0xf793dda4 in ?? () from /usr/lib/i386-linux-gnu/libpangoft2-1.0.so.0
    #23 0xf7f69ec9 in ?? () from /usr/lib/i386-linux-gnu/libpango-1.0.so.0
    #24 0xf7f6b71f in pango_itemize_with_base_dir () from /usr/lib/i386-linux-gnu/libpango-1.0.so.0
    #25 0xf7f748ec in ?? () from /usr/lib/i386-linux-gnu/libpango-1.0.so.0
    #26 0xf7f76991 in ?? () from /usr/lib/i386-linux-gnu/libpango-1.0.so.0
    #27 0xf7f76f1d in pango_layout_get_pixel_extents () from /usr/lib/i386-linux-gnu/libpango-1.0.so.0
    #28 0x56555b2a in main ()
    (gdb) 
    
[/code]

libfreetype.so.6 で止まっているようです。  
何か解決につながりそうなヒントがあれば助かります。


CC BY-SA 4.0
2018-08-16T03:12:08.477
47551
2018-08-21T05:23:53.210
2018-08-21T05:23:53.210
3060
29744
question
linux ubuntu
Ubuntu 18.04 で pango/cairo を用いた 32bit のプログラム が 64bit 環境でフリーズする


自己解決しました。フリーズしたのではなく、単に時間（10秒から30秒程度）がかかっていただけです。  
あくまで推測ですが、64bit環境で32bit用のフォントキャッシュを作るのに時間がかかっていたのではないかと思います。  
実際に試して回答くださった方に感謝いたします。


CC BY-SA 4.0
2018-08-21T04:54:51.080
47686
2018-08-21T04:54:51.080
29744
47551
answer