2011-08-14 32 views
1

我必須調試剝離了符號的Cocoa/Objective-C應用程序。我非常精通gdb和Objective-C。通常情況下,我使用類似otool或class-dump的工具來找出我需要使調試更容易一些。例如,類轉儲可以很容易地知道在運行時何處存在某些方法。gdb Objective-C無符號表

我的問題是:我可以「幫助」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 ??() 

回答

1

您需要在構建時生成的符號表;通常是.dSYM文件夾。有了這些,你可以在GDB中使用add-symbol-table,它通常會讓事情多一點。

事實之後,你不能真正生成符號表。許多開發人員會爲其應用程序的各種生產版本的符號表副本進行歸檔,以便可以更容易地調試崩潰痕跡,使符號化和可重現的崩潰(只在生產版本或特定的客戶端安裝中重現)。

The ??幀最有可能是沒有符號的C函數 - 當然#16和#17是_start()和main()。 #7可能是一些用於-performSelector:內部的CF goober。

0

這將是巨大的,如果我能得到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.ofoobar()地址通常會0。)

+0

感謝您的評論。在Mach_O文件中有一個__OBJC段,其中包含將方法IMP映射到地址位置所需的全部*信息。應該不需要進行任何「籃筐跳躍」,這是C. gdb所需要的,它應該能夠自行計算出來。 –

+0

它只會顯示OP已經顯示的回溯中顯示的內容;沒有符號表,你不會得到行號,變量名等....幀最有可能是沒有符號的C函數 - 當然#16和#17是_start()和main()。 #7可能是一些用於-performSelector:內部的CF goober。 – bbum