67

特定のライブラリをLD_PRELOADingしてプログラムを実行します。このような。

LD_PRELOAD=./my.so ./my_program

このプログラムをで実行するにはどうすればよいgdbですか?

4

6 に答える 6

77

以下をせよ。

gdb your_program

(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
于 2012-05-04T11:54:17.793 に答える
17

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
于 2017-01-24T07:39:38.413 に答える
13

すべてを(引数と環境を使用して)1つのコマンドとして実行する方法は次のとおりです。

例:

gdb --args env LD_PRELOAD=/usr/local/lib/libstderred.so ls -l

熱心なオブザーバーは、envここでexecラッパーとして機能することに気付くでしょう(Alexey Romanovの答えのように)。

于 2017-07-20T10:40:39.760 に答える
10

フラグenvを使用して、コマンドラインでexec-wrapperとして指定できます。-iex

gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
于 2017-11-14T13:18:43.330 に答える
1

私はVSCodeでgdbserverを使用しています。最も簡単な方法は、シェルにラップされたプログラムを起動することです。

gdbserver :8888 sh -c 'LD_PRELOAD=/libtest.so your_prog'
于 2021-08-27T07:28:05.387 に答える
0

基本的に同じ方法で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では動作しません!ライブラリが読み込まれません。つまり、少なくとも現在のツールでは、ここでの答えはどれも完全に正しいものではありません。

于 2014-10-22T08:39:59.923 に答える