実行可能ファイルをデバッグしようとしたとき:
(gdb) break +1
No symbol table is loaded. Use the "file" command.
それは正確にはどういう意味ですか?
シンボルテーブルは実行可能ファイルに追加されていますか?
Gdbが使用するシンボルのセットは2つあります。
-gセットはデバッグシンボルであり、デバッグ中にコードを確認したり変数を確認したりできるため、作業が非常に簡単になります。
コンパイル時に、デフォルトで別のシンボルセットが含まれます。これらはリンクシンボルであり、ELF(実行可能リンク可能フォーマット)シンボルテーブルに存在します。これには、デバッグシンボルよりもはるかに少ない情報が含まれていますが、実行可能ファイル(またはライブラリやオブジェクトファイル)内のもののアドレスなど、最も重要なものが含まれています。この情報がないと、gdbはmainがどこにあるかさえ知らないため、(gdb) break main
は失敗します。
デバッグシンボル(-g)がない場合でも、(gdb) break main
を実行できますが、gdbにはソースファイルのコード行の概念がありません。コードをステップ実行しようとすると、一度に1行ではなく、一度に1つのマシン命令のみを進めます。
Stripコマンドは、実行可能ファイル(または他のオブジェクトファイル)からシンボルをstrip
オフするためによく使用されます。これは、誰かに記号を見せたくない場合や、ファイルのスペースを節約したい場合によく使用されます。シンボルテーブルは大きくなる可能性があります。 Stripは、デバッグシンボルとリンカーシンボルの両方を削除しますが、削除するものを制限できるコマンドラインスイッチがいくつかあります。
プログラムでfile
コマンドを実行すると、天気かどうかがわかり、実行可能ファイルが削除されていることがわかります。
$ gcc my_prog.c -o my_prog
$ file my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
$ strip my_prog
my_prog: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, stripped
$
これは、デバッグをオンにしてコンパイルしなかったためです。 gcc -gfile.cを試してください
シンボルテーブルには、元のソースコードファイル内のどのシンボル(関数名や変数名など)に対応するメモリ位置をデバッガーに通知するデバッグ情報が含まれています。シンボルテーブルは通常、実行可能ファイル内に保存されます。
gdbは、そのテーブルが見つからないと言っています。 gccを使用してコンパイルした場合、-gフラグを使用しない限り、ファイルにシンボルテーブルは含まれません。最も簡単な方法は、おそらく-gを使用してファイルを再コンパイルすることです。 gdbは、シンボルテーブル情報を自動的に検出する必要があります。
Gccのコマンドライン引数またはプログラムのコンパイルに使用したMakefileに-gフラグを追加します。 (多くの場合、Makefile内にCFLAGSなどと呼ばれる変数があります)。
任意のサードパーティプログラムをデバッグしようとすると、多くの場合、情報がプログラムから「削除」されます。これは、リバースエンジニアリングを困難にし、実行可能ファイルのサイズを小さくするために行われます。ソースコードにアクセスでき、プログラムを自分でコンパイルできない限り、gdbを使用するのは非常に困難です。
アプリケーションのエントリポイントを見つけます。
objdump -f main
main: file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048054
Gnuデバッガーを使用してそこにブレークポイントを設定します
gdb
exec-file main
break *0x8048054
set disassemble-next-line on
run
次に、コードをステップスルーします
gdb
stepi
特記事項
最新バージョンのUbuntuを使用している場合、これによる影響はありませんが、Ubuntu 10.04以前を実行している場合は、このバグが発生する可能性があります。
https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/151518G
解決策は、エントリポイントアドレスプラス1でデバッグを開始することです。