Linux上での位置を障害

  
カーネルAPIが正式kprobeの使用を提供するため、

観測インスタンス停電のLinuxカーネルのインストールkprobeに使用kprobeのカーネル関数は、非常に多くのコアプログラマカーネル関数に実装された機能をプロービングするSystemTapであります、おそらくより便利に直接使用するSystemTapをkprobe未満である。カーネルはkprobeハンドラの3種類の、それぞれのJProbe、kprobe、kretprobeを提供し、次のコードは、三の観察プローブとTCP /IP arp_process関数で実行されます.. Windows7の故障

arp_probe.c /* *:()呼び出しのip_route_inputに同じ機能エントリハンドラRetのハンドラコードで次のようにもプローブとの間の共有パラメータの方法を示し、このコードの結果を返しますQianfeng張によってarp_probe.c、([email protected])* /

の#includeの#includeの#includeの#includeの#includeの#includeの#includeの#include

MODULE_AUTHOR(" frzhang @ redhat.com"); MODULE_DESCRIPTION(" ip_route_inputのコール結果を追跡するためのモジュール()arp_process内部のJProbeとkretprobe"を使用して、); MODULE_LICENS E(" GPL");

静的INT j_arp_process(構造体sk_buff *のSKB){構造体net_device * DEV = skb-> devの、構造体in_device * in_dev; int型no_addr、RPF;

in_dev = in_dev_get(DEV); no_addr =(in_dev-> ifa_list == NULL); RPF = IN_DEV_RPFILTER(in_dev); in_dev_put(in_dev)のprintk(" \\ narp_processは()インターフェースデバイス%のS、in_devと呼ばれ(no_addr =%dを、RPF =%d)は\\ N" DEV->名、no_addr、RPF); jprobe_return();戻り値(0);};

静的INT j_fib_validate_source(__ BE32のSRC、 __be32 DST、U8 TOS、INT OIF、構造体net_device * DEV、__be32 * spec_dst、U32 * ITAG、U32マーク)

{のprintk(" fib_validate_source()= DST = 0X%X、OIFと呼ばれ%D \\ N"、DST、OIF); jprobe_return();戻り値(0);};

静的構造体のJProbeのmy_jp1 = {.ENTRY = j_arp_process、.kp.symbol_name =" arp_process"};


静的構造体のJProbeのmy_jp2 = {.ENTRY = j_fib_validate_source、.kp.symbol_name =" fib_validate_source"};

静的INT entry_handler(構造体KRE tprobe_instance * RI、構造体pt_regs * REGS){のprintk("呼び出し:%S()\\ N" [1-> RP-> kp.symbol_name);リターン(0);};

静的INT return_handler(構造体kretprobe_instance * RI、構造体pt_regs * REGS){int型EAX;

EAX = regs-> AX& 0xFFFFで;のprintk("戻っ:%S()戻り値を持ちます。 0X%のLX(64)0X%X(32ビット)\\ N" [1-> RP-> kp.symbol_name、regs-> AX、EAX);

リターン(0);};

静的INT fib_lookup_entry_handler(構造体kretprobe_instance * RI、構造体pt_regs * REGS){構造体fib_resultの*のRESP;

RESP =(構造体fib_result *)regs-> DX;のprintk("コーリング:%S()\\ N" [1-> RP-> kp.symbol_name); *((構造体fib_result **)[1->データ)= RESP;

リターン(0)。 };


静的INT fib_lookup_return_handler(構造体kretprobe_instance * RI、構造体pt_regs * REGS){構造体fib_result * RESP; INT EAX;

EAX = regs-> AX & 0xFFFFで、RESP = *((構造体fib_result **)[1->データ)のprintk("戻っ:fib_lookup()を呼び出すと値:0X%LX(64)0X%X(32ビット)、result->タイプ:%D \\ N" regs-> AX、EAX、resp->タイプ);

リターン( 0);}

静的構造体kretprobe my_rp1 = {.handler = return_handler、.entry_handler = entry_handler、.kp.symbol_name =" ip_route_input_slow"};


スタティック構造体kretprobe my_rp2 = {.handler = return_handler、.entry_handler = entry_handler、.kp.symbol_name =" fib_validate_source"};


静的構造体kretprobe my_rp3 = {.handler = fib_lookup_return_handler ,. entry_handler = fib_lookup_entry_handler、.kp.symbol_name =" fib_lookup" .data_size =はsizeof(構造体fib_result *)};

静的INT __init init_myprobe(ボイド){int型RET;

のprintk( " RTN_UNICASTは%D \\ N"ある、RTN_UNICAST); IF((RET = register_jprobe(&#038; my_jp1))< 0){のprintk(" register_jprobe%Sは、失敗した%D \\ N"返さ; ​​my_jp1.kp。 symbol_nameと、RET);リターン(-1);}

IF((RET = register_jprobe(&#038; my_jp2))< 0){のprintk("レジster_jprobe%S、失敗%d個の\\ N"を返さ; my_jp2.kp.symbol_name、RET);リターン(-1);}

((RET = register_kretprobe場合(&#038; my_rp1))< 0) {のprintk("%S失敗register_kretprobe、%d個の\\ N"を返さ; my_rp1.kp.symbol_name、RET); unregister_jprobe(&#038; my_jp1); unregister_jprobe(&#038; my_jp2);リターン(-1);}

IF((RET = register_kretprobe(&#038; my_rp2))< 0){のprintk(" register_kretprobe%sは、失敗した返さ%D \\ N" my_rp2.kp.symbol_name、RET); unregister_jprobe(&#038; my_jp1 ); unregister_jprobe(&#038; my_jp2); unregister_kretprobe(&#038; my_rp1);リターン(-1);}

IF((RET = register_kretprobe(&#038; my_rp3))< 0){のprintk("。 register_kretprobe%sは、失敗した返さ%D \\ N" my_rp3.kp.symbol_name、RET); unregister_jprobe(&#038; my_jp1); unregister_jprobe(&#038; my_jp2); unregister_kretprobe(&#038; my_rp1); unregister_kretprobe(&#038; my_rp2);リターン(-1);}

戻り0;}

Copyright © Windowsの知識 All Rights Reserved