web-dev-qa-db-ja.com

実行中のプロセスによる使用済みライブラリのリストの取得(UNIX)

UNIXプロセスがロードし、その存続期間を通して使用する可能性のあるライブラリーを見つける必要があります。これは可能ですか?あるいは、ライブラリ名があり、どのプロセスがそれを使用しているかを調べる必要がありますが、これは可能です。

同じように、UNIXプロセスがいつ起動し、いつ終了するかを通知することは可能ですか?それらは私のプロセスの子プロセスではなく、グローバルに知る必要があるだけです。

更新:

情報が足りなかったようです。私が話していたunixはMacOS Xであり(実際には完全にunixではないという人もいます)、プロセスに読み込まれているライブラリを見つける方法を探していました。C/ C++でそれを行う必要があります。

32
Alexander Cohen

Solarisには pldd があります。 Linuxの場合、実行可能ファイルで ldd を呼び出すか、実行中のプロセスで pmap を呼び出すか、マッピングされたライブラリの/proc/PID/mapsを調べます。 。

41

lsofがインストールされていない場合は、単に/ proc/$ pid/mapsをcatできます

lddを使用してディスク実行可能ファイルをチェックし、それらが開くライブラリを確認することもできます(ただし、dlopen()を使用して動的に開かれたライブラリは表示されません)。

新しいプロセスの監視については、/ procにinotify監視を追加して、新しい数値のみのディレクトリの作成/破棄を監視できます。

更新:/ procのinotifyは機能しませんが、明らかに代替案があります。 このスレッド を参照してください

11
ggiroux

OS Xでは、DYLD_PRINT_LIBRARIES

export DYLD_PRINT_LIBRARIES=1
./your_process
8
Cong Ma

Mac OS Xでは、vmmap $pidを使用して、プロセスに割り当てられたメモリ領域のリストを取得できます。これは、読み込まれたすべてのライブラリを表示します(少なくとも、ここでは10.7.5で機能します)。

ps -Aはすべてのプロセスのリストを提供するため、ps -A | grep $APPNAMEvmmap $pidで使用するプロセスID $ pidを取得します。 lsof -p $pidも機能します。

問題は、C++からの動的メソッドを要求しているようです。これらのコマンドでポーリングして結果を分析できますが、高速のロード/アンロードイベントを見逃す可能性があります。

lsofは、BSDライセンスに基づくオープンソースソフトウェアです。そのソースコードは間違いなく、C/C++からこれを行う方法についての洞察を提供します。参照: http://en.wikipedia.org/wiki/Lsof

8
Ross Bencina

lsofを使用できます。詳細については、manページを参照してください。別のツールはstraceです。プロセスが起動されているかどうかを確認するには、ps -efgrepにパイプするか、pgrepのようなツールも使用します。戻り値をチェックして、終了したかどうかを確認します。

5
ghostdog74

私もこれをしようとしています(失敗しています)。 mach_vm_readとvm_region_recurse_64を見てください。 vmmapやAppleのCrash Reporterなどのクローズドソースアプリケーションも、これらのメソッドとオープンソースGDBを使用してこれを行います。そこを探して答えを探すこともできますが、ソースを読むのは簡単ではありません。

2
alaska.alex

私はあなたが探している具体的な答えはありませんが、私は近いものを持っています。それはおそらくあなたが望むものに近づくでしょう。次の方法で、特定のバイナリ(プロセスではない)のリンクライブラリを表示できます。

  1. xcodeのインストール https://developer.Apple.com/xcode/
  2. 実行:otool -L PATH_TO_BINARY

例:

chris$ otool -L /usr/local/bin/mtr
mtr:
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
    /usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
    /usr/lib/libresolv.9.dylib (compatibility version 1.0.0, current version 46.1.0)