2010-09-27 1 views
5

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

Я использую gdb, составленный против 10.5 SDK на 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:]() 
+0

Вам лучше задавать вопрос о проблеме, с которой вы столкнулись, что привело вас к поиску этой информации в первую очередь. –

+0

@Ben: Мне вряд ли удастся получить ответ на вопрос «при замене дистрибутива памяти Firefox на 32-битный Mac, почему я получаю этот segfault?», Хотя, если бы вы могли ответить на него, я был бы очень благодарен :) –

+1

Untru :. Я уже думал о выравнивании объектов как возможного виновника. –

ответ

1

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

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

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

0

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

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

+0

Ну, исходный код для многих из них доступен онлайн, поэтому я думал, что смогу что-то получить. –

+0

Вам нужно будет создать свои собственные версии отладки :( –

+0

В качестве побочного примечания вы можете указать gdb посмотреть где-нибудь еще на символы с набором «(gdb) solib-absolute-prefix <путь/to/libs>») , и вы можете установить альтернативный путь к альтернативному источнику с помощью «(gdb) set substitute-path », если бы вы смогли получить конкретную библиотеку под вопросом с символами ... –