2011-08-14 10 views
1

シンボルを削除したCocoa/Objective-Cアプリケーションをデバッグする必要があります。私はgdbとObjective-Cに精通しています。通常、私はotoolやclass-dumpのようなツールを使って、デバッグをもっと簡単にするために必要なものを見つけます。たとえば、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にアクセスでき、一般的にもう少し詳しく説明します。

事実の後で実際にシンボルテーブルを生成することはできません。多くの開発者は、クラッシュトレースを記号化でき、再現性のあるクラッシュ(プロダクションビルドや特定のクライアントインストールでしか再現できない)をより簡単にデバッグできるように、アプリのさまざまなプロダクションリリースのシンボルテーブルのコピーをアーカイブします。

??フレームはシンボルがないC関数です - 確かに#16と#17は_start()とmain()です。 #7は--performSelector:内部用に使用されるいくつかのCF Gooberです。

0

私は私のためにこれを行うには、GDBを得ることができればそれは素晴らしいことです。

私はあなたができるはずです。 (私はObjective-Cのためにこれをやっていませんが、plain-Cのためだけですが、何か違いがあるとは想像できません)。

Cの場合、foobar()がアドレス0x12345678にあることをGDBに教えたいとします。その後:

echo 'void foobar() { }' | gcc -c -xc- -o foobar.o 
(gdb) add-symbol-file foobar.o 0x12345678 

(再配置可能foobar.ofoobar()のアドレスは、通常0になるので、これは動作します。)

+0

ありがとうございます。 Mach-Oファイルには、メソッドIMPをアドレス位置にマップするために必要な情報のすべて*を含む__OBJCセグメントがあります。 gdbが必要とする「フープジャンプ」は必要ありません。gdb自身がこれを把握できるはずです。 –

+0

これはOPがすでに示したバックトレースに表示されているものだけを表示します。シンボルテーブルがなければ、行番号、変数名などは得られません。フレームはシンボルがないC関数です - 確かに#16と#17は_start()とmain()です。 #7は--performSelector:内部用に使用されるいくつかのCF Gooberです。 – bbum