メモリ内容の採取
先の採取例では,
そこで, リスト11 採取対象関数 先述したように, そこで, リスト12 データ領域内容採取Dスクリプト このDスクリプトによって, 図5 データ領域内容の採取 上記の D スクリプトにおけるアクション部分は, それではここで初めて出てきた Dスクリプトでは, 上記のDスクリプト なお, これまでに説明してきた手法を組み合わせれば, 後は関数の戻り値を採取できれば, 以下のDスクリプトは, リスト13 関数戻り値採取Dスクリプト 何らかのデータが格納されている領域を指すアドレスが戻り値になっていて, なお, 関数フローにおける基本的な情報採取について, 次回は,checksum
を想定します。なお,checksum
)int
checksum(const char* buf)
{
int val = 0;
int i;
int length = 32;
for(int i = 0 ; i < length ; i += 1){
val = (val << 1) ^ buf[i];
}
return val;
}
buf
が指しているユーザ空間のメモリ内容を一旦カーネル空間にコピーしてから,pid$target:show_args:checksum:entry
{
this->iobuf = alloca(32);
copyinto(arg0, 32, this->iobuf);
tracemem(this->iobuf, 32);
}
buf
の指す領域は以下のような形式で表示されます。$ dtrace -s watch_arg_mem.d \
-q \
-c './show_args'
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
0: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 .ELF............
10: 02 00 03 00 01 00 00 00 80 09 05 08 34 00 00 00 ............4...
$
iobuf
を確保alloca
サブルーチンによって)iobuf
変数にバッファ領域を参照させるchecksum
関数の引数buf
の指すメモリ領域iobuf
の指す領域copyinto
サブルーチンによって)iobuf
の指す領域32バイト分をtracemem
アクションによって)copyinto
やtracemem
などは,this
というキーワードは何でしょうか?this->VariableName
と記述することで,iobuf
変数を使用していることになります。tracemem
に指定するデータ長は,
戻り値の採取
show_
中の全ての関数に対して,pid$target:show_args::return
{
printf("%s()=0x%p", probefunc, arg1);
}
pid
プロバイダでentry
プローブを指定するDスクリプトでは,arg0
やarg1
は関数引数の参照に使用しました。しかし,return
プローブを指定するDスクリプトでは,
arg0
: 関数の戻り先アドレスarg1
: 関数の戻り値copyinstr
やcopyinto
+ tracemem
などを使用する必要があります。
arg1
の値は,
void
な)次回予告