GDB Objective-C Нет таблицы символов - PullRequest
1 голос
/ 14 августа 2011

Мне нужно отладить приложение 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 ?? ()

Ответы [ 2 ]

1 голос
/ 14 августа 2011

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

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

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

0 голосов
/ 14 августа 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.)

...