web-dev-qa-db-ja.com

GDBでソースファイルを「リロード」する方法

gdbに、ソースファイルを(再)ロード/「更新」するために使用できるコマンドはありますか? (私が見る限り、gdbはソースディレクトリでのみ機能します。 デバッグによるとGDBの場合:ソース -「更新」する特定のコマンドはありません

私の問題の背景:

デバッグカーネルを備えた仮想マシンを使用しているので、gdbのローカルインスタンスに接続し、カーネルモジュールをデバッグできます。モジュールはデバッグ情報をオンにしてコンパイルされ、これはモジュールのソースが保持されるフォルダーを指定します( オブジェクトファイルに埋め込まれたソースを使用するようにGDB 6.5に指示します-スタックオーバーフロー )。 VMとローカルマシンの両方の同じパスにソースディレクトリがあります。

問題はこれです-モジュールをセグメンテーション違反にするためにかなりの手順を実行する必要があります-そしてリモートgdbをスタックに入れます。次に、バックトレースを実行すると、参照されているソースファイルを確認できます。

#0  0xc0132a13 in ?? ()
#1  0xc056e551 in ?? ()
#2  0xc056e506 in ?? ()
#3  0xd8be53f3 in mymodule_func1 (var1=0xd79f9b44, var2=0x0, var3=825269148)
    at /media/src/mymodule.h:954
#4  0xd8be53d0 in mymodule_func2 (data=3617561412)
    at /media/src/mymodule.h:936
#5  0xc014fe87 in ?? ()
#6  0xc0151478 in ?? ()

次に、list /media/src/mymodule.h:954と言ってみますが、ローカルバージョンのmymodule.hファイルの内容が変更されていることに気付きました。

したがって、変更を元に戻しますが、残念ながら、GDBはこれらの変更を認識しません。そしてもちろん、GDBを再起動したくありません-つまり、VMを再起動し、カーネルモジュールを再びセグメンテーション違反に陥らせるために手順全体を実行する必要があるからです:( !!

それから私はこのようなことをしようとします:

(gdb) show symbol-reloading
Dynamic symbol table reloading multiple times in one run is off.
(gdb) set symbol-reloading on
(gdb) add-symbol-file ~/mymodule.o 0xd8be4000
add symbol table from file "/media/src/mymodule.o" at
    .text_addr = 0xd8be4000
(y or n) y
Reading symbols from /media/src/mymodule.o...done.

...何らかの形でソースファイルを「リロード」することを期待して-しかし残念ながら、list /media/src/mymodule.h:954は、gdbdoesは、warning: Source file is more recent than executable....(のように何かが変更されたことを認識しますしたがって、当面は、VMおよびgdb全体を再起動する必要があります:( :(

24
sdaau

directory コマンドを使用してディレクトリリストをリセットすると、目的の効果が得られるようです。

35
nandhp

から https://www.cs.rochester.edu/~nelson/courses/csc_173/review/gdb.html

プログラムを変更した後、fileコマンドで実行可能ファイルをリロードします

  (gdb) file gdbprog
  A program is being debugged already.  Kill it? (y or n) y

  Load new symbol table from "gdbprog"? (y or n) y
  Reading symbols from gdbprog...
  done.
  Breakpoint 1 at 0x2298: file gdbprog.cc, line 10.


  (gdb) run
  Starting program: gdbprog 

  Breakpoint 1, InitArrays (array=0x18be8)
        at gdbprog.cc:10
  10                for(i = 0;i < 10;i++)
5
Eduardo

この警告は、バイナリが作成されたソースファイルが新しい変更で更新されることを意味します。この警告を削除するには、デバッグしているバイナリを新しいファイルと変更されたファイルで再構築するだけです。

0
Manoj