我必须调试一个已删除其符号的Cocoa / Objective-C应用程序。我非常精通gdb和Objective-C。通常,我使用像otool或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 ?? ()
答案 0 :(得分:1)
您需要在构建时生成的符号表;通常是.dSYM文件夹。有了这些,您可以在GDB中add-symbol-table
,它通常可以解决更多问题。
事实之后,您无法真正生成符号表。许多开发人员将为其应用程序的各种生产版本存档符号表的副本,以便可以对崩溃跟踪进行符号化,并且可以更轻松地调试可重现的崩溃(仅在生产版本或特定客户端安装上重现)。
??帧很可能是没有符号的C函数 - 当然#16和#17是_start()和main()。 #7可能是一些CF goober用于-performSelector:internals。
答案 1 :(得分:0)
如果我能让gdb为我做这件事会很棒。
我希望你能够。 (我没有为Objective-C做过这个,只针对普通C,但我无法想象会有什么区别)。
对于C
,假设您想教授foobar()
位于地址0x12345678
的GDB。然后:
echo 'void foobar() { }' | gcc -c -xc- -o foobar.o
(gdb) add-symbol-file foobar.o 0x12345678
(这是有效的,因为在可重新定位的foobar.o
中,foobar()
的地址通常为0
。)