繁体   English   中英

gdb Objective-C 无符号表

[英]gdb Objective-C No Symbol Table

我必须调试一个已剥离其符号的 Cocoa/Objective-C 应用程序。 我非常精通 gdb 和 Objective-C。 通常,我使用像 otool 或 class-dump 这样的工具来找出我需要什么来使调试更容易一些。 例如,类转储可以很容易地知道某些方法在运行时的位置。

我的问题是:在查看回溯时,我可以“帮助”gdb 在运行时提供更好的符号信息吗? 在下面的回溯中,我知道(通过使用 class-dump)标记为“??”的所有方法是什么是。 如果我能让 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 ?? ()

您将需要在构建时生成的符号表; 通常是 .dSYM 文件夹。 有了这些,您可以在 GDB 中add-symbol-table ,它通常会解决更多问题。

事后您无法真正生成符号表。 许多开发人员会为他们的应用程序的各种生产版本归档符号表的副本,以便可以对崩溃跟踪进行符号化,并且可以更轻松地调试可重现的崩溃(仅在生产版本或特定客户端安装上重现)。

这?? 帧很可能是没有符号的 C 函数——当然 #16 和 #17 是 _start() 和 main()。 #7 可能是一些用于 -performSelector: internals 的 CF goober。

如果我能让 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 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM