如何调试 WebKit2GTK+ 扩展
How to debug WebKit2GTK+ extensions
我正在尝试让 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(( 函数很重要(稍后会谈到这一点(
网络扩展.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 %sn",
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 hin";
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()
没有显示任何工作/被调用的迹象,因为"分机嗨"未打印到控制台中。
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
}
如果需要更多信息来找到解决方案,我将编辑这个问题。
这些是我正在使用的资源:
- https://webkitgtk.org/reference/webkit2gtk/stable/WebKitWebExtension.html
- https://blogs.igalia.com/carlosgc/2013/09/10/webkit2gtk-web-process-extensions/
由于它是C++,这可能是由于名称重整。尝试在 webkit_web_extension_initialize 函数前面加上 extern "C"。例如:
extern "C" G_MODULE_EXPORT void
webkit_web_extension_initialize (WebKitWebExtension *extension)
{
std::cout << "extension hin";
/* your code */
}
您可以使用 readelf 或 objdump 列出所有导出的符号,并查看它们是否有损坏的名称。
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- C++中的VLA,扩展名为std=C++11
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- C++返回 Numpy 数组的 Python 扩展模块
- 扩展可变参数模板中的变量名称
- 扩展C++生成的代码的模板参数类型名称
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- 将元组类型扩展为可变参数模板?
- 如何按文件扩展名引用文件夹中的文件
- HDF5Cpp 扩展复合数据集超板问题
- MSVC中的宏观扩展问题
- 嵌套参数包扩展失败
- C4204:使用的非标准扩展:非常量聚合初始值设定项
- WebKit2GTK+ "page-created"扩展只工作一次
- 如何调试 WebKit2GTK+ 扩展