ltrace在某些二进制文件上不起作用

根据手册页,ltrace应该拦截并logging任何执行的进程上的dynamic库调用,但是它似乎无法在某些二进制文件上正常工作。

这是在试图跟踪strcpy时重现问题的方法。

我首先看到ltrace能够处理一些二进制文件(这里是wget):

# 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错误还是预期的行为?

为了达到预期的权限( setuid和friends)和一个合适的守护进程配置, httpd在启动之后不久就自动分叉,并且原来的进程退出(在strcpy()被调用之前)。 gdb自动遵循新的过程, ltrace可以跟着它,但是你必须通过给它一些额外的选项告诉它,例如ltrace -f