1. ホーム
  2. c

[解決済み] コンパイル済みのプログラムに対してGDBを使用してもシンボルテーブルが表示されない

2022-02-28 13:25:27

質問

前置きが長くなりましたが、これは私の初めてのC言語プログラミングの授業でのプロジェクト用です。 私のコードは動作しているので教えるつもりはありませんが、実行中にGDBから受け取るエラーについてのサポートが必要です。

とはいえ、私のプロジェクトの最初の部分は、任意のファイルをバイト単位で受け取り、ある長さの文字列を探し出すプログラムを書くことでした。 これはうまくいった。 次に、コンパイルされたCファイルを3つ用意し、GDBとヘックスエディタ、そして私のプログラムを使って、プログラムのロックを解除するための隠しパスワードを割り出す必要がありました。 最初のものはできたのですが、2番目と3番目は難易度が上がっていて、何が間違っているのかがわかりません。

以下は私の問題です。

GDBを使ってコンパイルしたファイルの実行を開始すると、すぐにGDBに点滅するカーソルが表示されます。 そこで cntrl c でプログラムを中断させ、プログラムを一時停止させる。 次に back で、(9)行のリストとそのメモリ位置、メソッドの名前が表示されます。 ここで、私の問題は、もし私が main() と表示され、ブレークを入力しようとすると No symbol table is loaded. Use the "file" command .

Starting program: [program path on university server] 
^C
Program received signal SIGINT, Interrupt.
0x00110430 in __kernel_vsyscall ()
Missing separate debuginfos, use: debuginfo-install glibc-2.12-
1.132.el6_5.3.i686
(gdb) list
No symbol table is loaded.  Use the "file" command.
(gdb) back
#0  0x00110430 in __kernel_vsyscall ()
#1  0x00c8f8d3 in __read_nocancel () from /lib/libc.so.6
#2  0x00c2972b in _IO_new_file_underflow () from /lib/libc.so.6
#3  0x00c2b44b in _IO_default_uflow_internal () from /lib/libc.so.6
#4  0x00c2ca5a in __uflow () from /lib/libc.so.6
#5  0x00c1f36c in _IO_getline_info_internal () from /lib/libc.so.6
#6  0x00c1f2b1 in _IO_getline_internal () from /lib/libc.so.6
#7  0x00c1e1ea in fgets () from /lib/libc.so.6
#8  0x0804851c in main ()
(gdb) 

などの他のスレッドも見てみましたが gdb: "シンボルテーブルが読み込まれていません" 私がクラックしようとしているファイルはすでにコンパイルされ提供されているので、これは私には関係ないと思います。 だから、私は正確にCソースファイルをデバッグしているのではなく、圧縮されたファイルをデバッグしているのです。

これは今私が苦労しているところです。 No symbol table is loaded. という問題があります。

解決方法を教えてください。

その No symbol table loaded というメッセージが表示されますが、これは誤解を招く恐れがあります。 すべて GDBがあなたに伝えているのは、あなたのバイナリにはデバッグ情報がない、ということです。

通常、この問題は、バイナリを -g フラグがありますが、すでにコンパイルされリンクされたファイルが与えられているため、それはできません。

デバッグ情報がない場合、特定のコマンド、例えば list , break file.c:line または break line 意志 ない が動作します。しかし、他のコマンドは、次のようなものです。 disassemblebreak function 意志 が動作し、この課題ではこのコマンドを使用する必要があります。

<ブロッククオート

使用できるコードと使用できないコードのコマンド一覧はありますか

私が知っている限りではありません。しかし、あなたは 推論 デバッグ情報の内容を理解することで、そのリストが何であるかを知ることができます。

デバッグ情報には、一般的に次のようなものが含まれます。

  1. コードアドレス(すなわちプログラムカウンタ)からソースファイルおよび行番号へのマッピング。(このようなマッピングがない場合。 listbreak foo.c:123 は動作しません)。
  2. ローカル変数とグローバル変数の型と名前。(これがないと ptypewhatisinfo locals は動作しません)。
  3. ローカル変数とパラメータのスタック上の位置。(再度 info locals , print a_local_var , print &a_local_var は動作しない)