safari - 如何让 XCode/GDB 融入 Safari 5.1 NPAPI 插件?

标签 safari gdb npapi macos

我有一个在 OS X 10.6.8 上运行的 NPAPI 插件,我想对其进行调试。当我使用 FireFox 3.6.19 加载它时,我可以将事件可执行文件设置为 FF,启动 FF,使用 XCode 附加,断点将在预期时间触发。

使用 Safari 5.1 时,我发现插件在进程中运行,因此我为/System/Library/PrivateFrameworks/WebKit2.framework/PluginProcess.app 创建并激活了客户可执行文件。然后,我启动 Safari,导航到托管插件的页面,附加到插件进程,然后使用 UI,这样断点应该触发,但它没有。我可以通过 UI 判断该插件已加载。如果暂停该过程,我会看到:

(gdb) i b
Num Type           Disp Enb Address    What
1   breakpoint     keep y   <PENDING>  "ADP_NPAPI_Interface.m":34
2   breakpoint     keep y   <PENDING>  "ADP_NPAPI_Interface.m":34
3   breakpoint     keep y   <PENDING>  "ADP_NPAPI_Interface.m":34
4   breakpoint     keep y   <PENDING>  "plugin.cpp":244
5   breakpoint     keep y   <PENDING>  "plugin.cpp":358
6   breakpoint     keep y   <PENDING>  objc_exception_throw
(gdb) show directories
Source directories searched: $cdir:$cwd
(gdb) info sources
No symbol table is loaded.  Use the "file" command.
(gdb) file sources
sources: No such file or directory
(gdb) info file
No registers.
No registers.
(gdb) show paths
Executable and object file path: /Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin

DEBUG_INFORMATION_FORMAT = dwarf-with-dsym。我的理解是符号将在插件中,所以,我相信 gdb 找不到我的源文件。

预先感谢您的帮助, 戴夫

最佳答案

我偶尔使用过的一种方法 FireBreath插件是这样的:

#if WAIT_FOR_DEBUGGER
static bool beingDebugged() {
    int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()}; size_t mib_size = 4;
    struct kinfo_proc kp; size_t kp_size = sizeof(kp);
    int result = sysctl(mib, mib_size, &kp, &kp_size, NULL, 0);
    return (0 == result) ? (P_TRACED & kp.kp_proc.p_flag) : false;
}
#endif

然后在入口点之一(例如 NP_Initialize)中执行以下操作:

#if WAIT_FOR_DEBUGGER
    #warning "WILL BLOCK ON P_TRACED"
    while (!beingDebugged())
        sleep(1);
#endif

我的一个 friend 想出了这个,看起来效果不错。但是,您应该知道,在 Safari 5.1 中,浏览器将在(相当短的)一段时间没有收到插件响应后杀死该插件(发送 SIG_KILL)。因此,使用 Safari 5.1 进行调试几乎是不可能的;因此,我强烈建议您在 Firefox 或 Chrome 中进行调试。

这将导致插件等待调试器附加。请注意,在 Safari 5.1 中,插件进程的名称已更改;我忘记了它现在到底是什么,但它肯定已经不在进程中了,而且它不是 Safari =]

有一天我会抽出时间将其添加到默认的 FireBreath np_mainmain.cpp文件....

关于safari - 如何让 XCode/GDB 融入 Safari 5.1 NPAPI 插件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7287418/

相关文章:

jquery - CSS 和 jQuery 导航问题

c++ - 关于 gdb 函数格式的说明

gdb - 如何从软件中断异常中获取调用堆栈

c++ - Firefox 和 Chrome 中的 NPAPI 支持真的下降了吗?

NPAPI 浏览器插件

javascript - Safari 和 Safari 移动设备上的 Iframe localStorage

html - 聚焦输入的 IOS7 Web 应用程序禁用滚动

html - Safari 自动填充使用包含单词 "email"和用户电子邮件地址的占位符属性填充任何字段

c++ - gdb断言失败

带有麦克风输入的 Web 应用程序