如何在Safari 5.1 NPAPI插件中使XCode / GDB中断?

时间:2011-09-02 17:56:59

标签: 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找不到我的源文件。

先谢谢你的帮助, 戴夫

3 个答案:

答案 0 :(得分:3)

我偶尔使用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

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

dwarf-with-dsym的“with-dsym”部分表示符号位于单独的符号文件中,而不是二进制文件中。

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