17

実行可能ファイルをデバッグしようとしたとき:

(gdb) break +1
No symbol table is loaded.  Use the "file" command.

それは正確にはどういう意味ですか?

実行可能ファイルにシンボル テーブルが追加されていますか?

4

4 に答える 4

27

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
$
于 2010-04-05T06:11:27.453 に答える
8

これは、デバッグをオンにしてコンパイルしなかったためです。gcc -g file.c を試す

于 2010-04-05T05:39:54.703 に答える
4

シンボル テーブルには、元のソース コード ファイル内のどのメモリ位置がどのシンボル (関数名や変数名など) に対応するかをデバッガーに伝えるデバッグ情報が含まれています。シンボル テーブルは通常、実行可能ファイル内に保存されます。

gdb は、そのテーブルが見つからないと言っています。gcc でコンパイルした場合、-g フラグを使用しない限り、シンボル テーブルはファイルに含まれません。最も簡単な方法は、おそらく -g を使用してファイルを再コンパイルすることです。gdb はシンボル テーブル情報を自動的に検索します。

-g フラグを gcc のコマンド ライン引数またはプログラムのコンパイルに使用した Makefile に追加します。(多くの場合、Makefile 内に CFLAGS などと呼ばれる変数があります)。

任意のサードパーティ プログラムをデバッグしようとしている場合、多くの場合、情報はそこから「取り除かれています」。これは、リバース エンジニアリングを困難にし、実行可能ファイルのサイズを小さくするために行われます。ソースコードにアクセスできず、自分でプログラムをコンパイルできない限り、gdb を使用するのは非常に困難です。

于 2010-04-05T05:44:58.753 に答える
3

アプリケーションのエントリ ポイントを見つけます。

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 でデバッグを開始することです。

于 2011-04-25T05:47:57.840 に答える