web-dev-qa-db-ja.com

LD_PRELOADでgdbを使用する方法

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

LD_PRELOAD=./my.so ./my_program

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

50
MetallicPriest

以下をせよ。

gdb your_program

(gdb) set environment LD_PRELOAD ./yourso.so
(gdb) start
59
MetallicPriest

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
12
Alexey Romanov

すべてを1つのコマンドとして(引数と環境を含めて)実行する方法を次に示します。

例:

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

熱心な観察者は、ここでenvがexecラッパーとして機能していることに気付くでしょう(Alexey Romanovの回答のように)。

8
user2394284

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

gdb -iex "set exec-wrapper env LD_PRELOAD=./my.so" ./my_program
6
ecatmur

基本的には同じ方法で行うことができます。プログラム名の前に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では動作しません。ライブラリが読み込まれません。つまり、少なくとも現在のツールでは、ここでの答えはまったく正しくありません。

0
Pavel Šimerda