gdb Objective-C Нет таблицы символов

Мне нужно отладить приложение Cocoa / Objective-C, в котором удалены символы. Я довольно хорошо разбираюсь в gdb и Objective-C. Обычно я использую такие инструменты, как otool или class-dump, чтобы узнать, что мне нужно, чтобы немного упростить отладку. Например, class-dump позволяет легко узнать, где во время выполнения находятся определенные методы.

У меня вопрос: могу ли я «помочь» GDB предоставить лучшую символьную информацию во время выполнения при просмотре трассировок? В следующей трассировке я знаю (с помощью дампа класса), какие все методы помечены как "??" являются. Было бы здорово, если бы я мог заставить GDB сделать это за меня.

Спасибо!

(gdb) bt
#0  0x960de54e in -[NSPersistentUIManager init] ()
#1  0x960de489 in __PersistentUIManager_block_invoke_1 ()
#2  0x9abd0693 in _NSFaultInObject ()
#3  0x960ad800 in +[NSPersistentUIManager sharedManager] ()
#4  0x961aefac in -[NSWindow _doOrderWindow:relativeTo:findKey:forCounter:force:isModal:] ()
#5  0x961aeefd in -[NSWindow orderWindow:relativeTo:] ()
#6  0x96238acc in -[NSWindow orderFront:] ()
#7  0x0000a032 in ?? ()
#8  0x9154bdaa in -[NSObject performSelector:] ()
#9  0x9154bd27 in -[NSSet makeObjectsPerformSelector:] ()
#10 0x960c16a7 in -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] ()
#11 0x960b744d in loadNib ()
#12 0x960b6834 in +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] ()
#13 0x960b673e in +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] ()
#14 0x960b6672 in +[NSBundle(NSNibLoading) loadNibNamed:owner:] ()
#15 0x9633d6c7 in NSApplicationMain ()
#16 0x00002cc6 in ?? ()
#17 0x00002bed in ?? ()

person Matty P    schedule 14.08.2011    source источник


Ответы (2)


Вам потребуются таблицы символов, которые были созданы во время сборки; обычно это папки .dSYM. С ними вы можете add-symbol-table в GDB, и он, как правило, разбирается во всем немного больше.

Фактически, вы не можете создать таблицы символов постфактум. Многие разработчики архивируют копии таблиц символов для различных производственных выпусков своих приложений, так что следы сбоев могут быть обозначены символами, а воспроизводимые сбои (которые воспроизводятся только в производственных сборках или при конкретной установке клиента) могут быть легче отлажены.

?? фреймы, скорее всего, являются функциями C, для которых нет символов - конечно, # 16 и # 17 - это _start () и main (). # 7, скорее всего, какой-то CF goober, используемый для -performSelector: внутренних компонентов.

person bbum    schedule 14.08.2011

Было бы здорово, если бы я мог заставить GDB сделать это за меня.

Я полагаю, ты сможешь. (Я не делал этого для Objective-C, только для простого C, но я не могу представить, что будет какая-то разница).

Для C, предположим, вы хотите научить GDB, что foobar() находится по адресу 0x12345678. Потом:

echo 'void foobar() { }' | gcc -c -xc- -o foobar.o
(gdb) add-symbol-file foobar.o 0x12345678

(Это работает, потому что в перемещаемом foobar.o адрес foobar() обычно будет 0.)

person Employed Russian    schedule 14.08.2011
comment
Спасибо за ваш комментарий. В файле Mach-O есть сегмент __OBJC, содержащий всю информацию, необходимую для сопоставления IMP методов с адресами. Не должно быть никаких прыжков с обруча, необходимых для C. gdb должен быть в состоянии выяснить это самостоятельно. - person Matty P; 14.08.2011
comment
Он покажет только то, что показано в трассировке, которую уже показал OP; без таблиц символов вы не получите номеров строк, имен переменных и т. д. ?? фреймы, скорее всего, являются функциями C, для которых нет символов - конечно, # 16 и # 17 - это _start () и main (). # 7, скорее всего, какой-то CF goober, используемый для -performSelector: внутренних компонентов. - person bbum; 14.08.2011