我需要调试一个objective-c程序。在main()函数上设置断点时,我得到:
Reading symbols from /usr/bin/pbcopy...done.
(gdb) break main
Function "main" not defined.从回复相同的错误中调用"start“。我怀疑在max os x上做事情的方式是不同的?
与objective C程序的等价物是什么?
顺便说一下,如何在exit()函数上中断?
编辑:我尝试按照Lyndsey的建议在-NSApplication上运行
(gdb) file pbcopy
Reading symbols for shared libraries ........ done
Reading symbols from /usr/bin/pbcopy...done.
(gdb) break -[NSApplication run]
Breakpoint 1 at 0x35a8356
(gdb) run
Starting program: /usr/bin/pbcopy
Reading symbols for shared libraries +++++++.................................................................... done
Breakpoint 1 at 0x95a97356
helo
^C
Program received signal SIGINT, Interrupt.
0x9574eeda in read$UNIX2003 ()
(gdb) bt
#0 0x9574eeda in read$UNIX2003 ()
#1 0x94d4e5b6 in _NSReadFromFileDescriptor ()
#2 0x94d4e4b6 in -[NSConcreteFileHandle readDataOfLength:] ()
#3 0x94d7f2fa in -[NSConcreteFileHandle readDataToEndOfFile] ()
#4 0x00002a11 in ?? ()
#5 0x00002736 in ?? ()
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x95a97356 <-[NSApplication run]+6>
(gdb) 这很奇怪,gdb是如何找到符号的地址而不破坏它的……顺便说一句,GDB似乎在加载动态库后改变了断点的地址。但这并不会伤害我,因为我认为ld需要重新定位。看到堆栈跟踪,我看到了很多??这让我假设触发应用程序的通常方式在这里不使用(??大假设...:/)
发布于 2009-05-14 23:54:25
pbcopy是一个命令行工具,而不是一个应用程序,所以它没有理由调用NSApplication run。断点之所以能够解决,是因为它(无论出于何种原因)都链接到了AppKit框架。
因为这是一个经过剥离的二进制文件,所以中断C函数名不会有很好的效果。如果你真的想到处看看,最好的办法就是丢弃程序集,并在此基础上找出你想要中断的地方。
如果你从整体上解释了你试图实现的目标,你可能会得到关于如何进行的更好的建议。
发布于 2009-05-14 20:56:43
您是否使用Cocoa Project模板创建了Objective-C应用程序?如果是,是哪一个?许多都有主要的功能。
你能发布你的main函数吗?在main函数中,键入:
int main(int argc, char *argv[]) {
*#error#是的,我正在被编译!
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}现在,构建你的应用程序,你得到了一个错误吗?如果不是,那么由于某种原因,您的带有main函数的代码实际上并没有被编译。确保它是正确的。
编辑2009年5月14日@ 5:22 EST:当应用程序被告知要运行时,您可能希望使用b -NSApplication run来中断。
https://stackoverflow.com/questions/865581
复制相似问题