2010-10-17 1 views
0

Я использую кросс-платформенный инструментарий, который обертывает Objective-C, поэтому я не могу/не могу использовать XCode. Просто чистая командная строка и простые старые make-файлы.Отладка приложений MacOSX Cocoa с командной строкой gdb (без XCode)

Я скомпилировал свой исходный код с помощью «gcc -Wall -g -O0», но при запуске под управлением gdb я не получаю фреймы стека или допустимые строки исходного кода.

Во-первых: Что я могу сделать, чтобы получить эту работу. Во-вторых: Как я могу использовать XCode (3.0), предоставляя мне интерфейс GUI для gdb.

Это то, что я получаю при установке точки останова и делать «трассировку» команду 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_», но они совершенно неправильно. Похоже, что ассоциация файлов/строк нарушена. Поэтому я должен исправить сначала, прежде чем получить любую действительную поддержку GUI от XCode.

UPDATE: Хорошо, я смог настроить проект и отладить приложение изнутри XCode, но это не то, что я действительно хочу. Отладка командной строки по-прежнему не работает, даже когда я сменил -g теперь на -gdwarf-2

ответ

0

В Xcode просто создайте старый проект makefile, добавьте исходный код в проект и, наконец, настройте пользовательский исполняемый файл (в разделе «Исполняемые файлы»), указывая на ваш встроенный отладочный исполняемый файл.

+0

Не работает. Установка контрольных точек в исходном файле не останавливает программу. – Lothar

+0

Основываясь на этом и том, что вы говорите в оригинальном вопросе, похоже, какая-то часть вашего приложения не строится с включенными символами отладки (или, возможно, в какой-то момент они удаляются)? –

+0

Я могу гарантировать, что все файлы создаются с помощью «gcc -Wall -g -O0», но вопрос в том, достаточно ли этого. Из Linux я знаю, что -g - единственный необходимый параметр. Здесь, на MacOSX, у меня проблемы. – Lothar

0

Вы не предоставляете достаточно информации, чтобы решить, что происходит, когда вы пытаетесь напрямую использовать GDB. Стенограмма сеанса gdb помогла бы (gdb ./foo, контрольная точка, run, backtrace).

Вы можете отладить любой уже запущенный процесс с помощью Xcode, выбрав «Запустить»> «Присоединить к процессу»> «Идентификатор процесса» .... Если проблема, которую вы отлаживаете, находится где-то внутри или ниже main(), вы можете ввести звонок pause() в начале main(), чтобы повесить процесс и дать вам время для присоединения, а затем просто сигнализировать о процессе, чтобы продолжить.

Намного легче было бы сделать, поскольку Павел Р. предлагает и настроил проект Xcode. Xcode действительно может использоваться для написания, сборки, запуска и отладки проектов на основе проектов. Вы всегда можете начать с пустого проекта и добавить исходный код и сами создать цели сборки. Xcode имеет встроенную поддержку целевых объектов построения с использованием внешнего типа Target Target, но даже если это не так, вы можете использовать цель Shell Script, чтобы пройти.

Смежные вопросы