General:
我总是在Linux上收到SIGSEGV,当使用XULRunner 15调用XRE_InitEmbedding2函数时。
详情:
我正在尝试将Mozilla(XULRunner 15.05b 64位(浏览器组件嵌入到Fedora 12 64位上的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平台上重现了类似的问题?也许我使用了一些错误的命令行参数或忘记在命令行中包含某些内容。
它可能与此未回答的错误报告有关:
从Firefox 10开始,我们在创建(构造函数(MozApp对象时崩溃。更准确地说,崩溃是通过调用 API 'XRE_InitEmbedding2(('(它的函数 指针有效!...直到 Firefox 版本 9,我们没有此崩溃 - 仅从版本 10 开始。您可以在此处的以下错误报告中找到详细信息: https://bugzilla.mozilla.org/show_bug.cgi?id=724822
您也许可以使用嵌入式 API。但是无论如何使用gtkmozembed 注定要失败,因为作者正在撤回对它的所有支持,因此您发现的任何问题都不会得到解决:
- 二进制嵌入公告在 mozilla.dev.embedding 中的未来
- Ubuntu 撤回 gtkmozembed
WebKitGTK通常被用作替代浏览器组件(基于WebKit(,尽管我发现它对于通过NPAPI运行Adobe Flash插件不稳定。如果你能忍受它的局限性,gtkhtml更简单,因此更可靠,并且可能更适合你。
最后,对于任何来到这里寻找 gtkmozembed 在 xulrunner 中使用 SIGSEGV 崩溃的解决方案的人来说(就像我一样(,答案可能是你忘记通过 run-mozilla.sh
运行你的应用程序,它告诉 Mozilla 在哪里可以找到它的组件。