首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用gdb调试objective-c程序(Apple提供的pbcopy)?

如何使用gdb调试objective-c程序(Apple提供的pbcopy)?
EN

Stack Overflow用户
提问于 2009-05-14 20:31:36
回答 2查看 2K关注 0票数 1

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

代码语言:javascript
复制
Reading symbols from /usr/bin/pbcopy...done.
(gdb) break main
Function "main" not defined.

从回复相同的错误中调用"start“。我怀疑在max os x上做事情的方式是不同的?

与objective C程序的等价物是什么?

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

编辑:我尝试按照Lyndsey的建议在-NSApplication上运行

代码语言:javascript
复制
(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需要重新定位。看到堆栈跟踪,我看到了很多??这让我假设触发应用程序的通常方式在这里不使用(??大假设...:/)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-05-14 23:54:25

pbcopy是一个命令行工具,而不是一个应用程序,所以它没有理由调用NSApplication run。断点之所以能够解决,是因为它(无论出于何种原因)都链接到了AppKit框架。

因为这是一个经过剥离的二进制文件,所以中断C函数名不会有很好的效果。如果你真的想到处看看,最好的办法就是丢弃程序集,并在此基础上找出你想要中断的地方。

如果你从整体上解释了你试图实现的目标,你可能会得到关于如何进行的更好的建议。

票数 3
EN

Stack Overflow用户

发布于 2009-05-14 20:56:43

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

你能发布你的main函数吗?在main函数中,键入:

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

*#error#是的,我正在被编译!

代码语言:javascript
复制
    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来中断。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/865581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档