5

man ページによると、ltrace は実行されたプロセスで動的ライブラリ呼び出しを傍受して記録することになっていますが、一部のバイナリでは正しく機能しないようです。

strcpy をトレースしようとしているときに問題を再現する方法を次に示します。

最初に、ltrace が一部のバイナリで動作できることを確認しました (wget here):

# ltrace -e strcpy wget --help >/dev/null
strcpy(0x63cc23, "auth-no-challenge")            = 0x63cc23
strcpy(0x63cc38, "background")                   = 0x63cc38
[...]
strcpy(0x63cf26, "verbose")                      = 0x63cf26
strcpy(0x63cf31, "verbose")                      = 0x63cf31
+++ exited (status 0) +++

同じコードが httpd で機能しなくなりました。

# ltrace -e strcpy /usr/sbin/httpd -t >/dev/null
Syntax OK
+++ exited (status 0) +++

gdb を使用して strcpy が呼び出されていることは確認できますが、ライブラリ呼び出しは追跡されませんでした。

# gdb --quiet --args /usr/sbin/httpd -t 
Reading symbols from /usr/sbin/httpd...(no debugging symbols found)...done.
(gdb) b strcpy
Breakpoint 1 at 0x15d08
(gdb) r
Starting program: /usr/sbin/httpd -t
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x2aaaaad1b000
[Thread debugging using libthread_db enabled]

Breakpoint 1, 0x00002aaaaca4d610 in strcpy () from /lib64/libc.so.6

これを Fedora 17 で実行しています。これは ltrace のバグですか、それとも予想される動作ですか?

4

1 に答える 1

2

期待されるパーミッション (setuidおよびフレンド) と適切なデーモン構成を実現するために、httpd開始直後に自分自身を fork し、元のプロセスを終了します (strcpy()呼び出される前のようです)。gdb自動的に新しいプロセスltraceに従い、それに従うこともできますが、いくつかの追加オプションを指定して、それを伝える必要がありますltrace -f

于 2012-10-15T17:07:40.143 に答える