2011-09-02 55 views
4

我在我想调试的OS X 10.6.8上运行一个NPAPI插件。当我使用FireFox 3.6.19加载它时,我可以将活动可执行文件设置为FF,启动FF,使用XCode进行连接,并且断点将在预期时间触发。如何让XCode/GDB打破Safari 5.1 NPAPI插件?

如果使用Safari 5.1,我看到,在用完工艺的插头,所以我创建并激活客户可执行/System/Library/PrivateFrameworks/WebKit2.framework/PluginProcess.app。然后,我启动Safari,导航到托管插件的页面,附加到插件进程,然后使用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插件偶尔使用

回答

3

一种方法是这样的:

#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文件....

+0

这并不是真的回答这个问题;您的指示用于附加,而OP成功附加,但缺少符号信息。 (此外,只有在需要调试初始化时才需要这种破解,否则不需要暂停并等待附加。) – smorgan

+1

啊,自从我回答后,他添加了更多信息;我相信他没有遵循正确的程序。那么,无论如何这都是有用的信息,所以时间不会被浪费。 – taxilian

0

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

的选项有: - 切换到纯矮 - 从构建目录复制.dsym束旁安装的插件 - 手动加载在gdb的DSYM(至少,我认为这是可能的,我实际上并没有这样做)

2

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