- 如何通過外部進程做呢?說,進程A想知道進程B中的系統調用?像strace?
- 如何打印出的過程本身調用系統調用?喜歡註冊一些事件?
的感謝!如何用編程的方式截獲在linux上運行的進程中調用的系統調用?
的感謝!如何用編程的方式截獲在linux上運行的進程中調用的系統調用?
用ps或其他方法檢查進程ID。然後運行「strace -p pidnumber」。
你可以檢查strace的是怎麼做的,源代碼是可用的,或者你可以只調用strace的從你的程序中......
但是有沒有任何編程方式可以這樣做?說一些函數來調用,一些系統調用陷阱事件來處理? – flyingbin
答案都在strace源代碼中。 –
如果是隻有一個特定的系統調用(不所有),您可以通過設置LD_PRELOAD來重新編寫C存根函數並將其放置在共享庫中並在執行目標應用程序之前預先加載庫。
這將導致你的函數優選於通過在動態鏈接器解析函數調用C庫提供的功能。
這僅適用於動態鏈接的應用程序(幾乎所有),你需要二進制兼容使用的C庫。由於幾乎所有的Linux都使用glibc,而不同的glibc版本是二進制兼容的,所以這應該不成問題。
你可以看看fakeroot的(作爲一個例子)關於如何做到這一點。
加入: 除了重新實現整個系統調用包裝器之外,還可以將調用轉發給C庫中的實際實現。我假設你需要手動加載庫並解析地址(不確定,否則你最終可能會自己調用)。
退房http://stackoverflow.com/questions/5494316/how-does-strace-work – Nobody
@沒有人,沒錯,一開始沒有注意到你的評論。 –