【问题标题】:ltrace doesn't work on some binariesltrace 不适用于某些二进制文件
【发布时间】:2012-10-15 16:09:56
【问题描述】:

根据手册页,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) +++

没有跟踪库调用,尽管我们可以确认 strcpy 是使用 gdb 调用的:

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

【问题讨论】:

  • 我的 Linux 手册页的 BUGS 部分有这个:Option -f sometimes fails to trace some children.

标签: linux debugging ltrace


【解决方案1】:

为了获得预期的权限(setuid 和朋友)和正确的守护进程配置,httpd 在它启动后不久就会分叉自己,然后原始进程退出(似乎在调用 strcpy() 之前) . gdb 自动跟随新进程,ltrace 可以跟随它,但你必须通过给它一些额外的选项来告诉它,例如ltrace -f.

【讨论】:

  • 我尝试了以下但没有成功
    # ltrace -f -e strcpy /usr/sbin/httpd -t >/dev/null Syntax OK +++ exited (status 0) +++
  • Hmmm... 也许strcpy 没有被使用(他们编写了自己的二进制版本,而不是依赖于 C 库中的版本),或者它是完全内联的(意味着没有实际的调用图书馆)或其他东西。
  • 我们可以确认strcpy是使用gdb调用的。查看初始描述
  • ltrace 无法追踪httpd 的原因是ltrace 不支持PIE 可执行文件。 $ echo 'main(){alarm(42);}'| gcc -fPIE -pie -x c -;ltrace ./a.out +++ exited (status 0) +++
    $ echo 'main(){alarm(42);}'| gcc -x c -;ltrace ./a.out (0, 0, 460544, -1, 0x1f25bc2) = 0x3290821160 __libc_start_main(0x4004c4, 1, 0x7fff0b523c38, 0x4004f0, 0x4004e0 <unfinished ...> alarm(42) = 0 +++ exited (status 0) +++
  • @NikhilAR 我不认为这是真的了
猜你喜欢
  • 1970-01-01
  • 2017-09-19
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 2017-07-20
  • 2014-03-22
相关资源
最近更新 更多