我在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找不到我的源文件。
先谢谢你的帮助, 戴夫
答案 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(至少,我相信这是可能的;我实际上并没有这样做)