gdb Objective-C无符号表

时间:2011-08-14 14:00:09

标签: objective-c gdb symbols

我必须调试一个已删除其符号的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 ?? ()

2 个答案:

答案 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。)