【问题标题】:How to debug WebKit2GTK+ extensions如何调试 WebKit2GTK+ 扩展
【发布时间】:2019-09-28 00:18:41
【问题描述】:

我正在尝试让 WebKit2GTK+ 扩展工作,它是一个简单的扩展,在创建页面时只会打印到控制台中。 这是我的项目结构:

-bin
-images
-include
-lib
--webextension
---libwebextension.so
---libwebextension.so.1
---libwebextension.so.1.0
---webextension.cpp
-src
--gtk
---gtk_manager.cpp
--main.cpp

gtk_manager.cpp 文件包含头文件的实现,只有 init() 函数很重要(稍后会介绍)

​​>

webextension.cpp

#include <webkit2/webkit-web-extension.h>
#include <iostream>

void
web_page_created_callback (WebKitWebExtension *extension,
                           WebKitWebPage      *web_page,
                           gpointer            user_data)
{
    g_print ("Page %d created for %s\n",
             webkit_web_page_get_id (web_page),
             webkit_web_page_get_uri (web_page));
}

G_MODULE_EXPORT void
webkit_web_extension_initialize (WebKitWebExtension *extension)
{
    std::cout << "extension hi\n";
    g_signal_connect (extension, "page-created",
                      G_CALLBACK (web_page_created_callback),
                      NULL);
}

void hi()
{
  g_print("hi");
}

运行时工作期间的导出和动态链接,我可以从 gtk_manager.cpp 的 init() 方法调用 hi()webkit_web_extension_initialize() 没有显示任何工作/被调用的迹象,因为“extension hi”没有打印到控制台中。

gtk_manager.cpp(gtk/gtk.h、glib.h 和 webkit2/webkit2.h 正在包含文件夹中的 gtk_manager.h 中)

#include "gtk/gtk_manager.h"
#include <iostream>

void initialize_web_extensions(WebKitWebContext*, gpointer);

void GTKManager::init(int argc, char* args[])
{
  g_signal_connect(webkit_web_context_get_default(), "initialize-web-extensions", G_CALLBACK(initialize_web_extensions), NULL);
  gtk_init(&argc, &args);
  /* other code */
}

/* other methods / functions */

void initialize_web_extensions(WebKitWebContext* context, gpointer userData)
{
  static guint uniqueId = 0;
  webkit_web_context_set_web_extensions_directory(context, "/abs/path/to/app/lib/webextension");
  webkit_web_context_set_web_extensions_initialization_user_data(context, g_variant_new_uint32(uniqueId++));
  hi(); // This is from webextension.cpp, it is called successfully
}

如果需要更多信息来找到解决方案,我将编辑此问题。

这些是我正在使用的资源:

【问题讨论】:

    标签: c++ gtk webkit webkit2-webextension


    【解决方案1】:

    由于它是 C++,可能是由于名称修改。尝试在 webkit_web_extension_initialize 函数前加上 extern "C"。例如:

    extern "C" G_MODULE_EXPORT void
    webkit_web_extension_initialize (WebKitWebExtension *extension)
    {
        std::cout << "extension hi\n";
        /* your code */
    }
    

    您可以使用 readelf 或 objdump 列出所有导出的符号,并查看它们是否有错误的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多