2014-01-10 24 views
1

我想使用Dtrace獲得用戶界面中的結構中的成員的值,而不是內核。有沒有什麼好的方式來訪問用戶土地的結構?

C代碼喜歡這樣的:

typedef struct 
{ 
    int a; 
}st_A; 

void fun1(st_A *p) 
{ 
    ...... 
} 

的DTrace腳本喜歡這樣的:

#!/usr/sbin/dtrace -qs 

pid$1::fun1:entry 
{ 
    printf("%d\n", *(int*)copyin(arg0, 4)); 
} 

就個人而言,我覺得這DTrace腳本很笨拙。如果結構包含很多成員,我需要計算每個成員的偏移量。如果結構包含指針數組,則情況非常糟糕!

那麼,有沒有什麼容易和優雅的方式來訪問用戶 - 土地過程中的結構membesr?非常感謝!

回答

4

的更常見的方式做,這在Solaris上是

typedef struct { 
    int a; 
} st_A; 

pid$1::fun:entry 
{ 
    self->kp = (st_A *)copyin(arg0, sizeof (st_A)); 
    printf("a = %d\n", self->kp->a); 
} 

但你說得對:如果你想跟着你的結構中三分球,那麼你將不得不重複copyin()每個解引用。

請記住,如果使用-C選項調用dtrace(1),則可以使用#include頭文件。無論如何,請使用-32-64來指示受害進程的數據模型:默認情況下,dtrace(1)將使用正在運行的內核的數據模型來解釋您指定的任何類型。

我認爲,Illumos的DTrace執行自動複製,但我沒有看過它。我不知道其他的實現。

相關問題