13

いくつかの gdb コマンドを実行する単純なテキスト ベースのユーザー インターフェイスを開発しようとしています。ユーザーがコードの特定の領域でポイントを設定してブレーク/トレースし、いくつかのデバッグ コマンドを実行できるようにしたいと考えています。

デバッグが必要な関数をユーザーに入力してもらいたい。次に、この関数名を取得して関数のソース コードを出力し、ブレーク/トレース ポイントを設定するコード行をユーザーに選択してもらいます。現時点では、逆アセンブル コマンドを使用してメモリ アドレスを出力できますが、代わりに実際のソース コードを出力したいと考えています。

これは gdb で実行できますか?

現在:

Dump of assembler code for function test_function:
   0x03800f70 <test_function+0>:  push   %ebp
   0x03800f71 <test_function+1>:  mov    %esp,%ebp
   0x03800f73 <test_function+3>:  sub    $0x48,%esp

私が欲しいもの:

void main()
{
  printf("Hello World\n");
}

ありがとう!

編集:私はこれを取得しています:

(gdb) list myFunction
941     directory/directory_etc/sourcefile.c: No such file or directory.
        in directory/directory_etc/sourcefile.c

次に、linenumを指定してみました:

(gdb) list directory/directory_etc/sourcefile.c:941
936     in directory/directory_etc/sourcefile.c

したがって、動作はあなたが説明しているものと似ていますが、「list filename:linenum」はまだ機能していません

ありがとうございました!

4

2 に答える 2

13

使用する:

(gdb) list FUNCTION

list詳細については、コマンドのオンライン ヘルプを参照してください。

(gdb) help list
List specified function or line.
With no argument, lists ten more lines after or around previous listing.
"list -" lists the ten lines before a previous ten-line listing.
One argument specifies a line, and ten lines are listed around that line.
Two arguments with comma between specify starting and ending lines to list.
Lines can be specified in these ways:
  LINENUM, to list around that line in current file,
  FILE:LINENUM, to list around that line in that file,
  FUNCTION, to list around beginning of that function,
  FILE:FUNCTION, to distinguish among like-named static functions.
  *ADDRESS, to list around the line containing that address.
With two args if one is empty it stands for ten lines away from the other arg.

おもちゃ以外のプロジェクトでは、おそらく次のようなケースに遭遇するでしょう:

$ gdb /bin/true
<...>
(gdb) start
<...>
(gdb) list printf
file: "/usr/include/bits/stdio2.h", line number: 104
file: "printf.c", line number: 29

コードベース内の関数の複数の定義をリストします。上記のprintf()場合、オーバーロードされていない純粋な C 関数には 2 つの定義があります。で定義されたものstdio2.h。次に、フォームを使用して、list FILE:LINENUMリストするものを指定できます。

(gdb) list printf.c:29
24  
25  /* Write formatted output to stdout from the format string FORMAT.  */
26  /* VARARGS1 */
27  int
28  __printf (const char *format, ...)
29  {
30    va_list arg;
31    int done;
32  
33    va_start (arg, format);

「sourcefile.c: No such file or directory」というエラーが表示される場合は、ソース コードを探す場所を GDB に指示する必要があります。GDB マニュアル: ソース パスを参照してください。明らかに、リストしたい関数のソースコードをマシンに実際に用意する必要があります。

于 2013-05-08T21:45:19.317 に答える