1. 程式人生 > >系統技術非業餘研究 » systemtap函式呼叫棧資訊不齊的原因和解決方法

系統技術非業餘研究 » systemtap函式呼叫棧資訊不齊的原因和解決方法

有時候在看系統程式碼的時候,我們很難從原始碼中看出我們感興趣的函式是如何被呼叫的,因為呼叫路徑有可能太多。使用者空間的程式gdb設斷點是個好的方法,核心的就麻煩了。這時候systemtap可以幫忙, 比如:

$uname -r
2.6.18-164.el5

$stap -V
SystemTap translator/driver (version 1.5/0.137 non-git sources)
Copyright (C) 2005-2011 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
enabled features: LIBRPM LIBSQLITE3 NSS BOOST_SHARED_PTR TR1_UNORDERED_MAP NLS

$sudo stap -e 'probe vfs.add_to_page_cache {print_backtrace();println("")}'
 0xffffffff8000c633 : add_to_page_cache+0x0/0xc1 [kernel]
 0xffffffff800c4565 : add_to_page_cache_lru+0xe/0x22 [kernel]
 0xffffffff80025a10 : find_or_create_page+0x4b/0x72 [kernel]
 0xffffffff80019b72 : __getblk+0x105/0x236 [kernel]
 0xffffffff8803826a
 0xffff811838293600 (inexact)
...

但是有時候我們並沒能得到全部的符號資訊, 比如# 0xffffffff8803826a 這行是誰沒打印出來吧。 原因是我們的模組可能被未知的模組所呼叫,這些模組的符號資訊沒有自動載入,所以systemtap當然就不知道誰是誰了!

解決方法 man stap 文件寫的很清楚:

-d MODULE
Add symbol/unwind information for the given module into the kernel object module. This may enable symbolic tracebacks from those mod-
ules/programs, even if they do not have an explicit probe placed into them.

–ldd Add symbol/unwind information for all shared libraries suspected by ldd to be necessary for user-space binaries being probe or listed
with the -d option. Caution: this can make the probe modules considerably larger.

–all-modules
Equivalent to specifying “-dkernel” and a “-d” for each kernel module that is currently loaded. Caution: this can make the probe modules
considerably larger.

$sudo stap --all-modules -e 'probe vfs.add_to_page_cache {print_backtrace();println("")}'
 0xffffffff8000c633 : add_to_page_cache+0x0/0xc1 [kernel]
 0xffffffff800c4565 : add_to_page_cache_lru+0xe/0x22 [kernel]
 0xffffffff80025a10 : find_or_create_page+0x4b/0x72 [kernel]
 0xffffffff80019b72 : __getblk+0x105/0x236 [kernel]
 0xffffffff8803826a : journal_get_descriptor_buffer+0x30/0x0 [jbd]
 0xffff81183f50c000 (inexact)

0xffffffff8803826a 這行我們知道是誰了把, jbd. 知道了這個模組我們就可以這樣:

$sudo stap -d jbd -e 'probe vfs.add_to_page_cache {print_backtrace();println("")}'            
 0xffffffff8000c633 : add_to_page_cache+0x0/0xc1 [kernel]
 0xffffffff800c4565 : add_to_page_cache_lru+0xe/0x22 [kernel]
 0xffffffff80025a10 : find_or_create_page+0x4b/0x72 [kernel]
 0xffffffff80019b72 : __getblk+0x105/0x236 [kernel]
 0xffffffff8803826a : journal_get_descriptor_buffer+0x30/0x0 [jbd]
 0xffff81183f50c000 (inexact)
...

二個一樣的的執行效果,只是生成的模組大小不一樣,我們來看下:

$sudo stap -d jbd -m demo -p4 -e 'probe vfs.add_to_page_cache {print_backtrace();println("")}' 
demo.ko
$ll demo.ko
-rw-r--r-- 1 root root 2943293 Mar 26 22:14 demo.ko

$sudo stap --all-modules -m demo -p4 -e 'probe vfs.add_to_page_cache {print_backtrace();println("")}'
demo.ko
$ll demo.ko
-rw-r--r-- 1 root root 3890409 Mar 26 22:15 demo.ko

–all-modules的生成要大不少,不過很適合我們這樣的懶人!

使用者空間的程式用–ldd來搞定!

玩得開心!

Post Footer automatically generated by wp-posturl plugin for wordpress.

相關推薦

系統技術業餘研究 » systemtap函式呼叫資訊原因解決方法

有時候在看系統程式碼的時候,我們很難從原始碼中看出我們感興趣的函式是如何被呼叫的,因為呼叫路徑有可能太多。使用者空間的程式gdb設斷點是個好的方法,核心的就麻煩了。這時候systemtap可以幫忙, 比如: $uname -r 2.6.18-164.el5 $stap -V Syste

系統技術業餘研究 » 調研核心呼叫方便的工具 kmalloc

我們在研究核心的時候,看了核心程式碼後,就想著某個函式被誰誰呼叫。 呼叫路徑有很多條,有熱門的,有偏門的,但從程式碼不大容易看出。 如果我們能和gdb那樣在函式上設個斷點,看下核心函式的呼叫棧就清楚了。 但是如何統計熱門路線呢?用systemtap就可以,參看這裡, 這裡。 但是用systemt

系統技術業餘研究 » systemtap如何跟蹤libc.so

下午和周忱同學折騰複雜程式的記憶體洩漏問題,用了valgrind, gogle perftools等工具都不大好用,很容易把應用程式搞死,於是打算用systemtap來在libc.so層面瞭解記憶體的使用情況。主要思路就是看malloc/realloc和free的呼叫次數的平衡。 首先準備下環境,

系統技術業餘研究 » Systemtap輔助設定tcp_init_cwnd,免對作業系統打Patch

前段時間google的工程師提出對tcp的擁塞視窗的初始值進行增大可以顯著的提高http的效能,這個主要是針對tcp的slow start的優化. 具體參考這裡, 這裡. 謝謝叔度同學從美國帶回第一手資訊! 由於低版本的linux核心的問題,這個引數的正確設定需要對os打patch,這個過程對線

系統技術業餘研究 » Systemtap的另類用法

通常我們在做核心程式設計的時候,會用到核心的資料結構,比如說textsearch提供了幾種演算法用於支付串查詢。在用於正式的專案前,我們會希望考察下他的用法以及想體驗下。最通常的做法是自己寫個module,寫個makefile,編譯,執行,然後去dmesg裡面看printk的結果。這個過程沒啥問題

系統技術業餘研究 » systemtap觀察page_cache的使用情況

在規劃伺服器的記憶體使用的時候經常需要知道應用在理想情況下會使用多少的pagecache, 我們好預先把這個記憶體預留出來. 這個值作業系統沒有提供可檢視的管道,我們只能自己寫個指令碼來實現. 下面的systemtap指令碼每隔N秒顯示下當前os下頭10個檔案佔用多少的pagecache, 降序

系統技術業餘研究 » systemtap全域性變數自動列印的原因解決方法

在執行stap的時候,經常會發現在指令碼結束執行的時候打出了很多無預期的東西,仔細一看都是些全域性變數的dump, 這個問題比較煩人. 我來演示下: $ cat > g.stp global xyz probe begin{ xyz=2010 exit(); } CT

系統技術業餘研究 » gen_tcp接受連結時enfile的問題分析及解決

最近我們為了安全方面的原因,在RDS伺服器上做了個代理程式把普通的MYSQL TCP連線變成了SSL連結,在測試的時候,皓庭同學發現Tsung發起了幾千個TCP連結後Erlang做的SSL PROXY老是報告gen_tcp:accept返回{error, enfile}錯誤。針對這個問題,我展開了

系統技術業餘研究 » 如何在TILEPro64多核心板卡上編譯執行Erlang

美國Tilera公司的眾核伺服器,單顆核心包含64顆CPU。硬體架構圖: 卡長這樣的: Erlang已經可以在這款CPU上成功執行,我們可以參考Ulf Wiger在Multicore ☺ Message-passing Concurrency 文件中關於Erlang在Tilera上的效能圖

系統技術業餘研究 » erl_nif Erlang的ffi 擴充套件erlang的另外一種方法

我們知道擴充套件erl有2種方法, driver和port. 這2個方法效率都低,因為都要經過 port機制,對於簡單的模組,這個開銷有時候是不可接受的。這時候nif來救助了。今天釋出的R13B03已經支援了,雖然是實驗性質的。 erl_nif的代表API functions for an Erl

系統技術業餘研究 » Linux IO協議框圖

這張圖很清晰的把linux IO協議棧的層次給勾出來了,而且內容很與時俱進,特別是SCSI裝置的層次對大家理解sg3這樣的包非常有幫助,強烈推薦大家好好研習! 祝玩得開心! Post Footer automatically generated by wp-posturl plugin fo

系統技術業餘研究 » dropwatch 網路協議丟包檢查利器

在做網路伺服器的時候,會碰到各種各樣的網路問題比如說網路超時,通常一般的開發人員對於這種問題最常用的工具當然是tcpdump或者更先進的wireshark來進行抓包分析。通常這個工具能解決大部分的問題,但是比如說wireshark發現丟包,那深層次的原因就很難解釋了。這不怪開發人員,要怪就怪lin

系統技術業餘研究 » 調查使用者空間程式某函式最常呼叫路徑

在做系統調優或者調查效能問題的的時候,比如說調查一個鎖的效能問題。 這把鎖的程式碼會有很多路徑會呼叫, 我們可以在鎖的地方設個probe點,但是我們無法知道那個路徑是最經常呼叫的。 所以我就寫了個stap指令碼來解決這個問題,程式碼在RHEL 5.4/6下都除錯沒有問題的。 $ cat >

系統技術業餘研究 » Linux下新系統呼叫sync_file_range

我們在做資料庫程式或者IO密集型的程式的時候,通常在更新的時候,比如說資料庫程式,希望更新有一定的安全性,我們會在更新操作結束的時候呼叫fsync或者fdatasync來flush資料到持久裝置去。而且通常是以頁面為單位,16K一次或者4K一次。 安全性保證了,但是效能就有很大的損害。而且我們更新

系統技術業餘研究 » 突破systemtap指令碼對資源使用的限制

我們在使用指令碼收集系統資訊的時候經常會用到map這樣的資料結構存放結果,但是stap指令碼在使用過程中經常會提升說”ERROR: Array overflow, check MAXMAPENTRIES near identifier ‘a’ at test.stp:6:5″ 類似這樣的資訊,然後

系統技術業餘研究 » gen_tcp呼叫程序收到{empty_out_q, Port}訊息奇怪行為分析

今天有同學在gmail裡面問了一個Erlang的問題,問題描述的非常好, 如下: 問題的背景是: 1、我開發了一個服務端程式,接收客戶端的連線。同一時刻會有多個客戶端來連線,連線後,接收客戶端請求後,再發送響應訊息,然後客戶端主動斷連。

系統技術業餘研究 » 用systemtap來修改下linux核心變數的值

我們在探索linux核心的時候,經常需要調整下變數的值,看它對系統的影響。如果這個值沒有透過/proc來修改的話,那隻能編譯核心。這個步驟是非常繁瑣的。現在我們有systemtap這個利器來幫忙了。 演示如下: 我們通過修改過 extern int sysctl_tcp_fin_timeout;的

系統技術業餘研究 » erlang到底能夠併發發起多少系統呼叫

為了測試下erlang的多smp能夠每秒併發發起多少系統呼叫,這個關係到erlang作為網路程式在高併發下的評估。 首先crack下otp_src,因為erlang:now() 是呼叫了clock_gettime這個系統呼叫,但是遺憾的是這個now裡面設計到很多mutex會導致不可預期的futex

系統技術業餘研究 » 再談systemtap在ubuntu 10.10下的安裝

安裝的時候有幾個地方需要注意: 在做步驟2的時候: $ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=10.10 DISTRIB_CODENAME=maverick DISTRIB_DESCRIPTION="Ubuntu

系統技術業餘研究 » 簡單的Map reduce用的收集函式

在處理大量重複任務的時候,為了加快速度,通常會用map-reduce的方式,要是能有段程式碼做這個事情就好了。作者luke寫了底下的程式碼片段,用起來感覺挺爽的,推薦給大家。原文見這裡 %% http://lukego.livejournal.com/6753.html – that doesn’