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

时间:2012-10-15 16:09:57

标签: linux debugging ltrace

根据手册页,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错误还是预期的行为?

1 个答案:

答案 0 :(得分:2)

要实现预期的权限(setuid和朋友)以及正确的守护程序配置,httpd在启动后很快就会自行分配,然后原始进程退出(在strcpy()之前似乎曾经被称呼。 gdb会自动跟随新流程,ltrace可以跟随它,但您必须通过提供一些其他选项来告诉它,例如ltrace -f