2010-10-17 57 views
0

我使用一个跨平台工具包,它包装Objective-C,所以我不/不能使用XCode。 只是纯粹的命令行和普通的旧makefile。使用命令行gdb(不带XCode)调试MacOSX可可应用程序

我使用“gcc -Wall -g -O0”编译我的源代码,但是在gdb控制下运行它时,我没有得到堆栈帧或有效的源代码行。

第一:我能做些什么来完成这项工作。 第二:如何使用XCode(3.0)给我一个gdb的GUI前端。

这是我所得到的设置断点,并做了“回溯” GDB命令

0 0x918194a9 in malloc_error_break() 
#1 0x91814497 in szone_error() 
#2 0x9173e523 in szone_free() 
#3 0x9173e38d in free() 
#4 0x000d3c53 in Agui_Paint_Context::checkFontColor() 
#5 0x000b2c81 in Agui_Color_Button::attribute_table() 
#6 0x000e5b2e in Agui_Scroll_Canvas_Scrolling_Mixin::~Agui_Scroll_Canvas_Scrolling_Mixin() 
#7 0x000e8968 in Agui_Scroll_Canvas_Scrolling_Mixin::~Agui_Scroll_Canvas_Scrolling_Mixin() 
#8 0x000e8cd9 in Agui_Scroll_Canvas_Scrolling_Mixin::~Agui_Scroll_Canvas_Scrolling_Mixin() 
#9 0x93325e8f in -[NSApplication sendAction:to:from:]() 
#10 0x93325dcc in -[NSControl sendAction:to:]() 
#11 0x93325c52 in -[NSCell _sendActionFrom:]() 
#12 0x933252ab in -[NSCell trackMouse:inRect:ofView:untilMouseUp:]() 
#13 0x93324afe in -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:]() 
#14 0x933243b8 in -[NSControl mouseDown:]() 
#15 0x93322af7 in -[NSWindow sendEvent:]() 
#16 0x932ef6a5 in -[NSApplication sendEvent:]() 
#17 0x0008dc6e in Agui_Attribute_Type_Boolean::~Agui_Attribute_Type_Boolean() 
#18 0x9324cfe7 in -[NSApplication run]() 
#19 0x0008e6b7 in Agui_Attribute_Type_Boolean::~Agui_Attribute_Type_Boolean() 
#20 0x0003faba in ??() 
#21 0x00073ddd in ??() 
#22 0x0007c996 in ??() 
#23 0x00004bb2 in ??() 
#24 0x00002d76 in ??() 
(gdb) 

的“Agui_”功能确实存在时,但他们是完全错误的。它看起来像文件/行关联中断。所以我必须先解决,然后才能从XCode获得任何有效的GUI支持。

更新:好的,我能够设置一个项目,并从XCode内部调试应用程序,但这不是我真正想要的。命令行调试仍然不起作用,即使我改变-g现在使用-gdwarf-2

回答

0

在Xcode中,只需创建一个遗留的makefile项目,将源代码添加到项目中,最后设置一个自定义可执行文件(在可执行文件下)指向您的内置调试可执行文件。

+0

不起作用。在源文件中设置断点不会停止程序。 – Lothar 2010-10-17 20:42:58

+0

基于这一点以及你在原始问题中的说法,它听起来像是你的应用程序的某个部分没有被启用调试符号构建(或者它们在某个时候被剥离了)? – 2010-10-17 21:08:32

+0

我可以保证所有文件都是用“gcc -Wall -g -O0”构建的,但问题是这足够了。从Linux我知道,-g是唯一必需的选项。在MacOSX上我有问题。 – Lothar 2010-10-17 21:15:59

0

当您尝试直接使用GDB时,您无法提供足够的信息来确定发生了什么问题。 gdb会话的抄本将有所帮助(gdb ./foo,断点栏,运行,回溯)。

通过运行>附加到进程>进程ID ...,您可以通过Xcode调试任何已经运行的进程。如果您正在调试的问题在main()以内的任何地方,您可以在main()开始时引入pause()的呼叫,以挂起您的流程并给您时间附加,然后只需指示流程继续进行即可。

更容易做到,因为Paul R.建议并建立一个Xcode项目。 Xcode确实可以用于编写,构建,运行和调试基于make的项目。您始终可以从一个空白项目开始,添加源代码并自行创建构建目标。 Xcode通过外部目标类型内置了对基于构建的构建目标的支持,但即使没有,也可以使用Shell脚本目标来实现。

相关问题