Как отлаживать системные библиотеки в OS X?

Я отлаживаю приложение Cocoa, которое вызывает системные библиотеки. Я получаю символы отладки для собственного кода, но не для системных библиотек, что останавливает дальнейшую отладку. Как я могу получить символы отладки для системной библиотеки.

Я использую gdb, компилируя SDK 10.5 на 10.6.4 (gcc 4.2).

Вот трассировка стека, для которой я хотел бы получить символы:

(gdb) bt
#0  0x93713e43 in CFQSortArray ()
#1  0x936f4c49 in CFArraySortValues ()
#2  0x958f0bc0 in ColorSyncProfileCopyTagSignatures ()
#3  0x9591d218 in CMMProfile::Usable ()
#4  0x9591cb5d in DoValidateProfile ()
#5  0x9591cc75 in AppleCMMValidateProfile ()
#6  0x958f1e52 in ColorSyncProfileVerify ()
#7  0x91b13b88 in validateProfile ()
#8  0x91b13aed in CMSValidateProfile ()
#9  0x93b27f6c in CGCMSInterfaceValidateProfile ()
#10 0x93b27f4c in CGCMSUtilsValidateProfile ()
#11 0x93b27e4b in CGColorSpaceCreateICCBased ()
#12 0x93b27203 in create_generic_color_space ()
#13 0x93b26f92 in CGColorSpaceCreateWithIndex ()
#14 0x90228ad5 in +[NSColorSpace specialColorSpaceWithID:] ()
#15 0x90228a0c in +[NSColorSpace genericRGBColorSpace] ()
#16 0x9022881e in -[NSBitmapImageRep _bitmapImageRep_setColorSpaceName:] ()
#17 0x904f6e39 in -[NSBitmapImageRep initWithBitmapDataPlanes:pixelsWide:pixelsHigh:bitsPerSample:samplesPerPixel:hasAlpha:isPlanar:colorSpaceName:bitmapFormat:bytesPerRow:bitsPerPixel:] ()
#18 0x902282ae in -[NSBitmapImageRep _initWithSharedBitmap:rect:] ()
#19 0x90227efe in -[NSImage _addRepresentationWithSharedKitWindow:rect:] ()
#20 0x90226d06 in +[NSImage _findSystemImageNamed:] ()
#21 0x90226a48 in +[NSImage imageNamed:] ()
#22 0x902268ea in -[NSCustomResource _loadImageWithName:] ()
#23 0x9022681e in -[NSCustomResource loadImageWithName:] ()
#24 0x90225d5f in -[NSCustomResource awakeAfterUsingCoder:] ()
#25 0x915a2208 in _decodeObjectBinary ()
#26 0x915a14e4 in _decodeObject ()
#27 0x9022556f in -[NSMenuItem initWithCoder:] ()
#28 0x915a21ec in _decodeObjectBinary ()
#29 0x915a2ff8 in -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] ()
#30 0x915a3665 in -[NSArray(NSArray) initWithCoder:] ()
#31 0x915a21ec in _decodeObjectBinary ()
#32 0x915a14e4 in _decodeObject ()
#33 0x90229ff0 in -[NSMenu initWithCoder:] ()
#34 0x915a21ec in _decodeObjectBinary ()
#35 0x915a2ff8 in -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] ()
#36 0x915a3665 in -[NSArray(NSArray) initWithCoder:] ()
#37 0x915a21ec in _decodeObjectBinary ()
#38 0x915a14e4 in _decodeObject ()
#39 0x9021ff29 in -[NSIBObjectData initWithCoder:] ()
#40 0x915a21ec in _decodeObjectBinary ()
#41 0x915a14e4 in _decodeObject ()
#42 0x9021f4a8 in loadNib ()
#43 0x9021eb5b in +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] ()
#44 0x9021e811 in +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] ()

person Paul Biggar    schedule 27.09.2010    source источник
comment
Вам лучше задать вопрос о возникшей у вас проблеме, из-за которой вы вообще искали эту информацию.   -  person Ben Stiglitz    schedule 28.09.2010
comment
@Ben: я вряд ли получу ответ при замене распределителя памяти Firefox только на 32-битном Mac, почему я получаю этот segfault?, хотя, если бы вы могли ответить на это, я был бы очень благодарен :)   -  person Paul Biggar    schedule 29.09.2010
comment
Унтру:. Я уже думал о выравнивании объектов как о возможном виновнике.   -  person Ben Stiglitz    schedule 30.09.2010
comment
@Ben: Знаешь, я думал, что ты, возможно, был прав. Но я выровнял все распределения памяти до 16 байт, и проблема не устранена, так что никаких игральных костей.   -  person Paul Biggar    schedule 01.10.2010


Ответы (2)


Как описано в этой технической заметке Apple, вы хотите установить для DYLD_IMAGE_SUFFIX значение _debug.

http://developer.apple.com/library/mac/#technotes/tn2004/tn2124.html

тогда есть дополнительные проблемы (отсутствие правильной версии в правильной системе), которые трудно преодолеть, поэтому я не проверял это.

person Paul Biggar    schedule 30.09.2010

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

Вы можете использовать команду gdb finish для запуска до тех пор, пока выбранный кадр стека не вернется. Сделайте это несколько раз, чтобы вернуться к коду приложения. Или просто next пройдитесь по вызовам библиотечных функций.

person Nikolai Fetissov    schedule 27.09.2010
comment
Ну, исходный код многих из них доступен в Интернете, так что я подумал, что смогу что-нибудь достать. - person Paul Biggar; 27.09.2010
comment
Вам придется создавать свои собственные отладочные версии этих :( - person Nikolai Fetissov; 28.09.2010
comment
В качестве примечания: вы можете указать gdb искать символы в другом месте с помощью (gdb) set solib-absolute-prefix ‹path/to/libs›, и вы можете установить замещающий путь к альтернативному источнику с помощью (gdb) set replace- путь ‹от› ‹к›, если вы смогли получить конкретную рассматриваемую библиотеку с символами... - person Aaron H.; 30.09.2010
comment
@ Аарон, да, это тоже. Спасибо. - person Nikolai Fetissov; 30.09.2010