実行可能ファイルをデバッグしようとしたとき:
(gdb) break +1
No symbol table is loaded. Use the "file" command.
それは正確にはどういう意味ですか?
実行可能ファイルにシンボル テーブルが追加されていますか?
実行可能ファイルをデバッグしようとしたとき:
(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 -g file.c を試す
シンボル テーブルには、元のソース コード ファイル内のどのメモリ位置がどのシンボル (関数名や変数名など) に対応するかをデバッガーに伝えるデバッグ情報が含まれています。シンボル テーブルは通常、実行可能ファイル内に保存されます。
gdb は、そのテーブルが見つからないと言っています。gcc でコンパイルした場合、-g フラグを使用しない限り、シンボル テーブルはファイルに含まれません。最も簡単な方法は、おそらく -g を使用してファイルを再コンパイルすることです。gdb はシンボル テーブル情報を自動的に検索します。
-g フラグを gcc のコマンド ライン引数またはプログラムのコンパイルに使用した Makefile に追加します。(多くの場合、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 でデバッグを開始することです。