特定のライブラリをLD_PRELOADingしてプログラムを実行します。このような。
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を呼び出す任意のプログラムを使用できます。envやnohupなど、いくつかの標準的なUnixユーティリティがこれを実行します。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の答えのように)。
フラグenv
を使用して、コマンドラインでexec-wrapperとして指定できます。-iex
gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
私はVSCodeでgdbserverを使用しています。最も簡単な方法は、シェルにラップされたプログラムを起動することです。
gdbserver :8888 sh -c 'LD_PRELOAD=/libtest.so your_prog'
基本的に同じ方法でgdb
、プログラム名の前に追加するだけです。
LD_PRELOAD=./my.so gdb ./my.program
以下を使用して環境変数を確認できます。
(gdb) show environment LD_PRELOAD
まれに、実際にgdb内で変更する必要があります。たとえば、をデバッグする場合は、次のdlopen()
ようにすることができます。
(gdb) set environment LD_PRELOAD ./my.so
ああ、待ってください、gdb 7.6.2では動作しません!ライブラリが読み込まれません。つまり、少なくとも現在のツールでは、ここでの答えはどれも完全に正しいものではありません。