2012-10-15 83 views
3

根據手冊頁,ltrace應該攔截並記錄任何執行的進程上的動態庫調用,但它似乎無法在某些二進制文件上正常工作。ltrace在某些二進制文件上不起作用

以下是在嘗試跟蹤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) +++ 

號庫電話是追根溯源,雖然我們可以確認的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 

我對費奧多爾執行此17.這是一個追蹤錯誤還是預期的行爲?

+0

我的Linux手冊頁在BUGS部分有這個選項-f有時無法跟蹤一些孩子。 –

回答

2

,達到了預期的權限(setuid和朋友)和適當的守護程序配置,httpd是它開始後不久分叉本身,然後原來的進程退出(前strcpy()被稱爲有史以來,似乎)。 gdb會自動遵循新過程,並且ltrace可以跟隨它,但您必須通過給它一些其他選項來告訴它。 ltrace -f

+0

我試過下面但沒有成功
''ltrace -f -e strcpy/usr/sbin/httpd -t>/dev/null 語法OK +++ exited(status 0)+++' –

+2

嗯......也許'strcpy'要麼不用(他們自己編寫的版本是在二進制文件中,而不是依賴於在C庫中),或者它是完全內聯的(意味着沒有實際的庫調用)或其他東西。 – twalberg

+0

我們可以確認使用gdb調用了strcpy。請參閱初始描述 –

相關問題