【问题标题】:How can I get XCode / GDB to break in a Safari 5.1 NPAPI plugin?如何让 XCode / GDB 闯入 Safari 5.1 NPAPI 插件?
【发布时间】:2011-09-02 17:56:58
【问题描述】:

我有一个在 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找不到我的源文件。

提前感谢您的帮助, 戴夫

【问题讨论】:

    标签: safari gdb npapi macos


    【解决方案1】:

    我偶尔使用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 文件中......

    【讨论】:

    • 这并没有真正回答问题;您的说明用于附加,而 OP 已成功附加但缺少符号信息。 (另外,这种hack实际上只有在需要调试初始化时才需要,否则无需暂停等待附加。)
    • 啊,自从我回答后,他添加了其他信息;我相信他没有依附于正确的过程。好吧,无论如何这对某人来说都是有用的信息,所以没有浪费时间。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        • 2016-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多