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

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

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

私の問題の背景:

私はデバッグカーネルを備えた仮想マシンを使用しているので、 のローカルインスタンスに接続してgdbカーネルモジュールをデバッグできます。モジュールはデバッグ情報をオンにしてコンパイルされ、これによりモジュールのソースが保存されるフォルダが指定されます(GDB 6.5 にオブジェクト ファイルに埋め込まれたソースを使用するように指示する - Stack Overflow)。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それは実現せず、何も変更されませんでした。gdb する何かが変更されたことを認識します。つまり、warning: Source file is more recent than executable....(そのため、当面は、VM全体を再起動する必要がありますgdb:( :( )

ベストアンサー1

ディレクトリリストをリセットするにはdirectoryコマンドは目的の効果をもたらしたようです。

おすすめ記事