特定のライブラリをLD_PRELOADしてプログラムを実行します。このような。
LD_PRELOAD=./my.so ./my_program
このプログラムをgdb
で実行するにはどうすればよいですか?
以下をせよ。
gdb your_program
(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
set environment
機能しませんでした:
GDBドキュメント から:
set exec-wrapper wrapper show exec-wrapper unset exec-wrapper
「exec-wrapper」が設定されている場合、指定されたラッパーはデバッグ用のプログラムを起動するために使用されます。 gdbは、execラッパープログラムの形式のシェルコマンドでプログラムを起動します。引用はプログラムとその引数に追加されますが、ラッパーには追加されないため、シェルに適切な場合は引用符を追加する必要があります。ラッパーは、プログラムが実行されるまで実行され、その後gdbが制御を引き継ぎます。
最終的にexecveを引数付きでラッパーとして呼び出す任意のプログラムを使用できます。いくつかの標準的なUnixユーティリティがこれを行います。 envとNohup。 exec "$ @"で終わるすべてのUnixシェルスクリプトも機能します。
たとえば、シェルの環境で変数を設定せずに、envを使用して環境変数をデバッグプログラムに渡すことができます:
(gdb) set exec-wrapper env 'LD_PRELOAD=libtest.so' (gdb) run
すべてを1つのコマンドとして(引数と環境を含めて)実行する方法を次に示します。
例:
gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l
熱心な観察者は、ここでenv
がexecラッパーとして機能していることに気付くでしょう(Alexey Romanovの回答のように)。
-iex
フラグを使用して、コマンドラインでexecラッパーとしてenv
を指定できます。
gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
基本的には同じ方法で行うことができます。プログラム名の前にgdb
を追加するだけです。
_LD_PRELOAD=./my.so gdb ./my.program
_
以下を使用して環境変数を確認できます。
_(gdb) show environment LD_PRELOAD
_
まれなケースですが、実際にはgdb内で変更する必要があります。 dlopen()
をデバッグするときは、次のようにします。
_(gdb) set environment LD_PRELOAD ./my.so
_
ああ、ちょっと待ってください。gdb7.6.2では動作しません。ライブラリが読み込まれません。つまり、少なくとも現在のツールでは、ここでの答えはまったく正しくありません。