1. 程式人生 > >系統技術非業餘研究 » Systemtap的另類用法

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

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

Systemtap是個指令碼,先翻譯成c kernel模組程式碼,然後編譯,插入到核心執行,同時提供最基本的核心和應用模組的通訊管道,在應用模組這裡收集資訊。 它還支援guru模式,讓使用者直接插入c程式碼。 這樣我們就可以利用stap的這一特性來做我們的實驗。

底下我們來演示下:

# cat ts.stp
%{
#include <linux/textsearch.h>
%}
function test_textsearch:long (algo:string) %{ /* pure */ /* unprivileged */
struct ts_config* ts;
struct ts_state state;

ts = textsearch_prepare(THIS->algo, "world", 5, GFP_KERNEL, TS_AUTOLOAD);
if(IS_ERR(ts)) goto err;
_stp_printf("%s\n", "prepare ok!");
if(UINT_MAX==textsearch_find_continuous(ts, &state, "hello world", 11)) goto err;
_stp_printf("%s\n", "find ok!");
textsearch_destroy(ts);
THIS->__retvalue = 0;
return;
err:
_stp_printf("%s\n", "init error!");
THIS->__retvalue = -1;
return;
%}

probe begin
{
printf("result:%d\n", test_textsearch(@1));
exit();
}

%%請注意我們上面用到了 _stp_printf,代替printk, 這個是stap的runtime的基礎服務。

# stap -gu ts.stp bm %%我們用的是BM演算法
prepare ok!
find ok!
result:0

cool吧! 把c語言當指令碼編寫啦。

但是這個stap有個缺點,就是標頭檔案必須是核心include路徑裡面的,如果我們用到了其他標頭檔案,編譯的時候就出錯。

# touch xyz.h #建個空的標頭檔案
# diff -u ts.stp ts1.stp
--- ts.stp      2010-11-08 12:04:54.000000000 +0800
+++ ts1.stp     2010-11-10 14:19:47.000000000 +0800
@@ -1,5 +1,6 @@
 %{
 #include <linux/textsearch.h>
+#include "xyz.h"
 %}
 
# stap -gu ts1.stp bm
/tmp/stapKuLo9R/stap_90d03f83d4d4a8efa7b721a6ff0093fe_2503.c:169:17: error: xyz.h: No such file or directory
make[1]: *** [/tmp/stapKuLo9R/stap_90d03f83d4d4a8efa7b721a6ff0093fe_2503.o] Error 1
make: *** [_module_/tmp/stapKuLo9R] Error 2
Pass 4: compilation failed.  Try again with another '--vp 0001' option.

這個問題挺煩人的,但是我們有探索精神,不怕的,我們來crack下吧

# diff systemtap-1.3/buildrun.cxx systemtap-1.3.patched/buildrun.cxx 
235a236,238
> 
>   o << "EXTRA_CFLAGS += $(STAP_CFLAGS)" << endl;
> 
237a241
>
# ./configure --prefix=/usr && make && make install

到現在為止 stap是crack過的. 我們再來實驗下吧!首先把我們的標頭檔案所在的路徑通知到systemtap,它會在讓編譯模組的時候加上我們的標頭檔案路徑。

# export STAP_CFLAGS="-I`pwd`"
# printenv STAP_CFLAGS
-I/home/wentong

# stap -gu ts1.stp bm
prepare ok!
find ok!
result:0

哈哈,成功了。

大家可以這樣的方式用stap寫很多好玩的東西,祝玩的開心。

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

No related posts.

相關推薦

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

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

系統技術業餘研究 » 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觀察page_cache的使用情況

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

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

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

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

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

系統技術業餘研究 » List comprehensions 用法

List Comprehensions List comprehensions are a feature of many modern functional programming languages. Subject to certain rules, they provide a succi

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

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

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

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

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

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

系統技術業餘研究 » GLIBC 2.16 支援systemtap靜態檢查點

剛@淘寶雕樑 告訴我 GLIBC 2.16 支援systemtap靜態檢查點,訊息源在這裡, 摘抄相關部分如下: * New configure option –enable-systemtap builds SystemTap static probes into libc for setj

系統技術業餘研究

ItPub寫的文章“2017 年度 DB-Engines 資料庫冠軍得主:PostgreSQL 封王!”, 點選 這裡 進一步閱讀 升的最快的幾個資料庫,我簡單的無責任點評: PG資料庫是很老的資料庫,不過這幾年冉冉升起,因為是學院派的,有很好的學術和智力的支援,一直以來在資料庫的體系結構,程式碼

系統技術業餘研究 » MySQL資料庫架構的演化觀察

MySQL資料庫架構的演化觀察 December 14th, 2017 Categories: 資料庫 Tags: mysql

系統技術業餘研究 » inet_dist_connect_options

Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke

系統技術業餘研究 » 推薦工作機會

最後更新時間:2014/11/28 請賜簡歷至:[email protected], 感謝您對加入我們公司有興趣,我們希望能早日和您共事。 以下幾個職位1年內有效,歡迎內部轉崗:
 資深資料工程師 公司:阿里(核心系統資料庫組) 工作地點:杭州(西溪園區) 崗位描述: 分析雲服務產生的海

系統技術業餘研究 » 新的工作和研究方向

和大家更新下: 做了將近8年資料庫後,我的工作和研究方向將會延伸到虛擬化和計算相關的雲服務,希望能夠和大家一起進步,Happy New Year! 預祝大家玩得開心! Post Footer automatically generated by wp-posturl plugin for w

系統技術業餘研究 » 叢集引入inet_dist_{listen,connect}_options更精細引數微調

Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke

系統技術業餘研究 » 2017升的最快的幾個資料庫無責任點評

ItPub寫的文章“2017 年度 DB-Engines 資料庫冠軍得主:PostgreSQL 封王!”, 點選 這裡 進一步閱讀 升的最快的幾個資料庫,我簡單的無責任點評: PG資料庫是很老的資料庫,不過這幾年冉冉升起,因為是學院派的,有很好的學術和智力的支援,一直以來在資料庫的體系結構,程式碼

系統技術業餘研究 » Erlang 17.5引入+hpds命令列控制程序預設字典大小

Erlang 17.5釋出引入控制程序預設字典大小的命令列引數: Erlang/OTP 17.5 has been released Written by Henrik, 01 Apr 2015 Some highlights of the release are: ERTS: Added co

系統技術業餘研究 » inet_dist_listen_options

Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke