如何用gdb调试objective-c程序(苹果提供的pbcopy)?

如何用gdb调试objective-c程序(苹果提供的pbcopy)?,objective-c,gdb,Objective C,Gdb,我需要调试一个objective-c程序。 在main()函数上设置断点时,我得到: Reading symbols from /usr/bin/pbcopy...done. (gdb) break main Function "main" not defined. 从reply调用“start”时会出现相同的错误。 我怀疑在max os x上做事情的方式是不同的 与objective c程序等效的是什么 顺便问一下,如何在exit()函数上中断 编辑:我尝试按照Lyndsey的建议在-[NS

我需要调试一个objective-c程序。 在main()函数上设置断点时,我得到:

Reading symbols from /usr/bin/pbcopy...done.
(gdb) break main
Function "main" not defined.
从reply调用“start”时会出现相同的错误。 我怀疑在max os x上做事情的方式是不同的

与objective c程序等效的是什么

顺便问一下,如何在exit()函数上中断

编辑:我尝试按照Lyndsey的建议在-[NSApplication run]上突破

(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)文件pbcopy
读取共享库的符号。。。。。。。。完成
从/usr/bin/pbcopy读取符号…完成。
(gdb)中断-[n应用程序运行]
断点1位于0x35a8356
(gdb)运行
启动程序:/usr/bin/pbcopy
阅读共享库的符号。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。完成
断点1位于0x95a97356
希洛
^C
程序收到信号SIGINT,中断。
0x9574eeda在读$UNIX2003()
(gdb)英国电信
#0 0x9574eeda在读$UNIX2003()
#文件描述符()中的1 0x94d4e5b6
#2 0x94d4e4b6 in-[NSConcreteFileHandle readDataOfLength:]()
#3 0x94d7f2fa in-[NSConcreteFileHandle readDataToEndOfFile]()
#4 0x00002a11英寸??()
#5 0x00002736英寸??()
(gdb)信息断点
Num Type Disp Enb地址什么
1断点保持y 0x95a97356
(gdb)
这很奇怪,gdb是如何找到符号的地址的,但没有破坏它。。。 顺便说一句,GDB似乎在加载动态库后更改了断点的地址。但这并没有伤害到我,因为我认为ld需要重新安置。
看到stacktrace,我看到了很多??让我假设触发应用程序的常用方法不在这里使用(?大假设…:/)

您是否使用Cocoa项目模板创建了Objective-C应用程序?如果是,哪一个?许多具有主要功能

你能发布你的主要功能吗?在主函数中,键入:


int main(int argc,char*argv[]){

#错误是的,我正在编译!

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}
现在,构建你的应用程序,你有没有收到一个错误?如果没有,那么由于某种原因,你的带有main函数的代码实际上没有被编译。确保它是正确的

编辑2009年5月14日美国东部时间5:22:您可能需要使用b-[n应用程序运行]
当应用程序被告知运行时中断。

您是否使用Cocoa项目模板创建了Objective-C应用程序?如果是,是哪一个?许多应用程序具有主要功能

你能发布你的主要功能吗?在你的主要功能中,键入:


int main(int argc,char*argv[]){

#错误是的,我正在编译!

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}
现在,构建你的应用程序,你有没有收到一个错误?如果没有,那么由于某种原因,你的带有main函数的代码实际上没有被编译。确保它是正确的

编辑2009年5月14日美国东部时间5:22:您可能需要使用b-[n应用程序运行]
当应用程序被告知运行时中断。

pbcopy是一个命令行工具,而不是应用程序,因此它没有理由调用[NSApplication run]。断点会解析,因为它(出于任何原因)链接到AppKit框架

由于这是一个精简的二进制文件,破坏C函数名不会很好地工作。如果你真的想到处看看,最好的办法是转储程序集,并根据它找出要破坏的地方


如果您解释了您试图完成的总体目标,您可能会得到关于如何继续的更好建议。

pbcopy是一个命令行工具,而不是应用程序,因此它没有理由调用[NSApplication run]。断点解析是因为它(出于任何原因)链接到AppKit框架

由于这是一个精简的二进制文件,破坏C函数名不会很好地工作。如果你真的想到处看看,最好的办法是转储程序集,并根据它找出要破坏的地方


如果你解释一下你要完成的总体目标,你可能会得到关于如何继续的更好的建议。

你是用XCode编写代码吗?你的问题对我来说没有意义。“当然”主函数不存在?为什么不存在?我用更多信息更新我的问题这里真正的问题不是“我如何调试objective-c程序”,它是“我如何调试一个没有源代码的剥离二进制文件?”这个问题的答案很大程度上取决于你所说的“调试”是什么意思“。你到底想完成什么?我试图回答这个问题:。当我尝试使用gdb时,我惊讶地发现gdb的start命令不起作用,我想知道为什么,以及如何使它与Obj-C程序一起工作(假设这个工具是用Obj-C编写的).谷歌没有帮我,所以我把我的问题贴在这里。我记得Obj-C程序在运行时会按照需要保留整个调试符号表-但我是Obj-C的新手,我可能错了…你是用XCode编写代码吗?你的问题对我来说没有意义。“当然”主函数不存在?为什么不存在?我用更多信息更新了我的问题这里真正的问题不是“如何调试objective-c程序”,而是“如何调试没有源代码的剥离二进制文件?”答案很大程度上取决于“调试”的含义。你到底想完成什么?我试图回答这个问题:。当我尝试使用gdb时,我惊讶地发现gdb的start命令不起作用,我想知道为什么,以及如何使它与Obj-C程序一起工作(假设此工具是用Obj-C编写的).谷歌没有帮我,所以我把我的问题贴在这里。我想一个Obj-C程序会在运行时保留它的整个调试符号表,因为它需要它-但我是Obj-C的新手,我可能错了…实际上这不是我的项目。我试着在“pbcopy”上启动gdb这是苹果在MacOSX10.5中提供的一个工具。我知道它是作为一个目标c程序实现的,用nm查看调试符号。但是