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

如何让XCode/GDB插入Safari 5.1 NPAPI插件?,safari,gdb,npapi,macos,Safari,Gdb,Npapi,Macos,我有一个运行在OSX10.6.8上的NPAPI插件,我想调试它。当我使用Firefox3.6.19加载它时,我可以将活动的可执行文件设置为FF,启动FF,使用XCode附加,断点将在预期时间触发 在使用Safari 5.1时,我看到插件已用完进程,因此我为/System/Library/privateframes/WebKit2.framework/PluginProcess.app创建并激活了一个客户可执行文件。然后我启动Safari,导航到托管插件的页面,连接到插件进程,然后使用UI,这样断

我有一个运行在OSX10.6.8上的NPAPI插件,我想调试它。当我使用Firefox3.6.19加载它时,我可以将活动的可执行文件设置为FF,启动FF,使用XCode附加,断点将在预期时间触发

在使用Safari 5.1时,我看到插件已用完进程,因此我为/System/Library/privateframes/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
(gdb)i b
Num Type Disp Enb地址什么
1断点保持y“ADP\u NPAPI\u Interface.m”:34
2断点保持y“ADP\u NPAPI\u Interface.m”:34
3断点保持y“ADP\u NPAPI\u Interface.m”:34
4断点保持y“plugin.cpp”:244
5断点保持y“plugin.cpp”:358
6断点保持y objc_异常_抛出
(gdb)显示目录
搜索的源目录:$cdir:$cwd
(gdb)信息来源
未加载任何符号表。使用“文件”命令。
(gdb)文件源
来源:没有这样的文件或目录
(gdb)信息文件
没有登记册。
没有登记册。
(gdb)显示路径
可执行文件和对象文件路径:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin
DEBUG_INFORMATION_FORMAT=dwarf with dsym。我的理解是符号将在插件中,因此,我相信gdb无法找到我的源文件

提前感谢您的帮助,
Dave

我偶尔在插件中使用的一种方法是:

#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)中执行以下操作:

我的一个朋友想出了这个办法,而且似乎效果很好。但是,您应该知道,在Safari 5.1中,浏览器在(相当短的)一段时间内没有收到插件的响应后,会终止插件(发送SIG_kill)。因此,几乎不可能使用Safari 5.1进行调试;因此,我强烈建议您在Firefox或Chrome中进行调试

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

总有一天,我会把它添加到默认的FireBreath文件中……

dwarf with dsym的“with dsym”部分意味着符号位于单独的符号文件中,而不是二进制文件中

你的选择是: -切换到普通矮人 -将.dsym捆绑包从构建目录复制到已安装插件旁边
-在gdb中手动加载dsym(至少,我相信这是可能的;不过我实际上还没有这样做)

Xcode有一个选项可以运行->附加到进程。使用此选项可附加到插件进程,而不是浏览器。从这里开始调试64位浏览器中运行的插件

这并不是真正的答案;您的说明用于附加,而OP已成功附加,但缺少符号信息。(而且,只有在需要调试初始化时才需要这种黑客,否则就不需要暂停并等待连接。)啊,自从我回答之后,他添加了额外的信息;我认为他没有遵循正确的流程。不管怎样,这对某人来说都是有用的信息,所以时间没有浪费。
#if WAIT_FOR_DEBUGGER
    #warning "WILL BLOCK ON P_TRACED"
    while (!beingDebugged())
        sleep(1);
#endif