好吧,我的 Mac fu 不是太强,但我有 Mac 的终端访问权限,并将给它一个疯狂的机会,希望为您提供继续所需的洞察力。
info sharedlibraryGDB 提示符会告诉您有关这些函数所在的共享库范围的详细信息。但是我们已经从函数名称中知道了这一点。
NSApplication 来自:可可。
该NSApplication对象维护NSWindow应用程序使用的所有对象的列表,因此它可以检索应用程序的任何
NSView对象。
所以我的建议是从启动应用程序开始
gdb --args /path/to/binary optional arguments for program
然后设置断点:
b NSApplicationMain
(.gdbinit显然可以在里面完成)
然后让应用程序继续。使用Ctrl+进入它C。很可能backtrace与您之前看到的类似,但可能不会达到mach_msg_trap().
然后转到使用具有NSApplication实例引用的函数的一帧。bt显然,您可以使用 找到帧号。所以说:
f 9
在那里你应该能够使用 GDB 的call. 现在,我的 Objective-C/C++ fu 比我的 Mac fu 还要弱,但是你可以使用
set language
列出可用的语言(这会影响 的语法call)。因此,您可能应该酌情切换到 Objective-C/C++ 替代方案之一。在我的 Mac 上,我有以下语言选项:
(gdb) set language
The currently understood settings are:
local or auto Automatic setting based on source file
ada Use the Ada language
c Use the C language
c++ Use the C++ language
asm Use the Asm language
minimal Use the Minimal language
fortran Use the Fortran language
objective-c Use the Objective-c language
objective-c++ Use the Objective-c++ language
java Use the Java language
modula-2 Use the Modula-2 language
pascal Use the Pascal language
scheme Use the Scheme language
call允许您在正在运行的程序的上下文中调用函数(并且 GDB 对它知道的符号具有命令行完成功能)。因此调用mainWindow了的NSApplication情况下会出现一个好主意,然后从那里向下搜索。
从那里你应该能够弄清楚你的按钮在哪里起作用并设置断点,不是吗?
基本上,如果您知道框架中某个调用的某个参数引用了您的按钮(我们假设它有一个指针),您可以使用
break location if condition
语法以确保断点只会在按下按钮时触发。另一种方法是ignore忽略断点的 X 次命中并仅在此之后触发的命令。