0

一般

XULRunner 15でXRE_InitEmbedding2関数を呼び出すと、Linuxで常にSIGSEGVを受け取ります。

詳細

Mozilla(XULRunner 15.05b 64ビット)ブラウザコンポーネントをFedora1264ビットのGTKアプリケーションに埋め込もうとしています。Eclipseプロジェクトを作成し、必要なすべてのXULRunnerライブラリを使用し、ファイルを含めるように構成して、正常にビルドしました。

アプリケーションコードは次のとおりです。

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <gtk/gtk.h>

#include "nsXPCOM.h"
#include "nsXPCOMGlue.h"
#include "nsEmbedString.h"
#include "nsXULAppAPI.h"
#include "nsILocalFile.h"

using namespace std;

XRE_InitEmbedding2Type XRE_InitEmbedding2Delegate;

int main(int argc, char** argv) {

    nsDynamicFunctionLoad kXRESymbols[] = {
        {"XRE_InitEmbedding2", (NSFuncPtr*) &XRE_InitEmbedding2Delegate},
        {0, 0}
    };

    GtkWidget *window;
    gtk_init(&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_show(window);

    nsresult rv = XPCOMGlueStartup("/home/Victor/Projects/JavaXPCOM/xulrunner-sdk/bin/libxpcom.so");
    if (NS_FAILED(rv)) {
        return rv;
    }

    rv = XPCOMGlueLoadXULFunctions(kXRESymbols);
    if (NS_FAILED(rv)) {
        return rv;
    }

    nsILocalFile *libXULDir;
    rv = NS_NewNativeLocalFile(nsEmbedCString("/home/Victor/Projects/JavaXPCOM/xulrunner-sdk/bin"), PR_FALSE, &libXULDir);
    if (NS_FAILED(rv)) {
        return rv;
    }

    rv = XRE_InitEmbedding2Delegate(libXULDir, libXULDir, nsnull);
    if (NS_FAILED(rv)) {
        return rv;
    }
    cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
    return 0;
}

このアプリケーションを次のコマンドラインでコンパイルしました。

make all 
Building file: ../src/JavaXPCOMTest.cpp
Invoking: GCC C++ Compiler
g++ -DXPCOM_GLUE_USE_NSPR=1 -DXPCOM_GLUE=1 -I/home/Victor/Projects/JavaXPCOM/xulrunner-sdk/include -I/usr/include/gtk-2.0 -I/usr/include/glib-2.0 -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++0x `pkg-config --cflags --libs gtk+-2.0` -MMD -MP -MF"src/JavaXPCOMTest.d" -MT"src/JavaXPCOMTest.d" -o"src/JavaXPCOMTest.o" "../src/JavaXPCOMTest.cpp"
Finished building: ../src/JavaXPCOMTest.cpp

Building target: JavaXPCOMTest
Invoking: GCC C++ Linker
g++ -L/home/Victor/Projects/JavaXPCOM/xulrunner-sdk/lib -L/home/Victor/Projects/JavaXPCOM/xulrunner-sdk/bin -Wl,-rpath-link,/home/Victor/Projects/JavaXPCOM/xulrunner-sdk/bin -o"JavaXPCOMTest"  ./src/JavaXPCOMTest.o   -lxpcomglue -lstdc++ `pkg-config --cflags --libs gtk+-2.0`
Finished building target: JavaXPCOMTest

このアプリケーションを実行すると、次の呼び出しスタックを使用してXRE_InitEmbedding2Delegate関数を呼び出すときにSIGSEGVを受け取ります。

Thread [1] 15449 (Suspended : Signal)   
    _dl_fixup() at 0x3dbd60dbec 
    _dl_runtime_resolve() at 0x3dbd614315   
    0x7fffee4031d3  
    0x7fffee429209  
    0x7fffee429223  
    0x7fffee42a943  
    0x7fffee42b7ae  
    0x7fffee42bb25  
    NS_InitXPCOM2_P() at 0x7fffee4063a9 
    XRE_InitEmbedding2() at 0x7fffed998ce7  
    <...more frames...>

XULRunner 15を使用したLinuxプラットフォームで同様の問題を再現した人はいますか?たぶん私はいくつかの間違ったコマンドラインパラメータを使用するか、コマンドラインに何かを含めるのを忘れています。

4

1 に答える 1

1

この未回答のバグレポートに関連している可能性があります:

Firefox 10 以降、MozApp オブジェクトの作成 (コンストラクター) 中にクラッシュが発生します。より正確には、クラッシュは API 'XRE_InitEmbedding2()' の呼び出しによるものです (関数ポインタは有効です!) ... Firefox のバージョン 9 までは、このクラッシュはありません - バージョン 10 以降のみです。次のバグレポートはこちら: https://bugzilla.mozilla.org/show_bug.cgi?id=724822

Embedded API を使用できる場合があります。しかし、gtkmozembed を使用することは運命づけられています。作成者はそれに対するすべてのサポートを撤回しているため、見つかった問題は修正されません

WebKitGTKは (WebKit ベースの) 代替ブラウザー コンポーネントとしてよく使用されますが、NPAPI を介して Adob​​e Flash プラグインを実行するには不安定であることがわかりました。その制限に耐えることができるなら、gtkhtml はよりシンプルで信頼性が高く、より適切に機能する可能性があります。

最後に、xulrunner の SIGSEGV で gtkmozembed がクラッシュする解決策を探してここにたどり着いた人 (私もそうでした) の答えは、Mozilla にコンポーネントの場所を伝えるrun-mozilla.shを通じてアプリを実行するのを忘れていることかもしれません。

于 2012-11-09T15:40:02.980 に答える