La localización de fallas en Linux

  

Uso kprobe función kernel a la falta de energía eléctrica Linux kprobe instalación kernel ejemplo observación es SystemTap sondeo funciones implementadas en la función del núcleo, ya que la API del núcleo para proporcionar un uso formal de kprobe, por lo que muchos programadores de núcleo , tal vez más conveniente que kprobe directamente uso SystemTap. kernel proporciona tres tipos de carretilla para kprobe, respectivamente JProbe, kprobe, kretprobe, el siguiente código es ejecutado en un TCP función arp_process /IP con la sonda tres observación en ip_route_input de () llamada devuelve el resultado de este código también ilustra un método de intercambio de parámetros entre la sonda y el mismo controlador de función de entrada Ret código del controlador es el siguiente: .. windows7 culpa

arp_probe.c /* * arp_probe.c, por Qianfeng Zhang ([email protected]) * /

#include #include #include #include #include #include #include #include

MODULE_AUTHOR (" frzhang @ redhat.com "); module_description (" Un módulo para realizar un seguimiento de los resultados de llamada de ip_route_input () dentro arp_process usando JProbe y kretprobe "); MODULE_LICENS E (" GPL ");

static int j_arp_process (struct sk_buff * SKB) {struct net_device * dev = skb- > dev; struct in_device * in_dev; int no_addr, RPF;

in_dev = in_dev_get (dev); no_addr = (in_dev- > ifa_list == NULL); RPF = (in_dev) IN_DEV_RPFILTER; in_dev_put (in_dev); printk (" \\ narp_process () se llama con dispositivo de interfaz% s, in_dev (no_addr =% d, RPF =% d) \\ n ", dev- > nombre, no_addr, FPR); jprobe_return (); return (0);};

int j_fib_validate_source estático (__ src be32, dst __be32, tos U8, int oif, struct net_device * dev, __be32 * spec_dst, u32 * itag, marca u32)

{printk (" fib_validate_source () se llama con dst = 0x% x, oif = % d \\ n ", dst, OIF); jprobe_return (); return (0);};

estática my_jp1 struct JProbe = {.entry = j_arp_process, .kp.symbol_name = " arp_process "};


estática struct JProbe my_jp2 = {.entry = j_fib_validate_source, .kp.symbol_name = " fib_validate_source "};

static int entry_handler (struct kre tprobe_instance * ri, pt_regs struct * regs) {printk (" de llamada:% s () \\ n ", RI- > RP > kp.symbol_name); return (0);};

static int return_handler (struct kretprobe_instance * ri, pt_regs struct *, reglas) {int eax;

eax = regs- > ax &0xffff; printk (" Volviendo:% s () con un valor de retorno: 0x% lx (64 bits) 0x% x (32 bits) \\ n ", RI- > RP > kp.symbol_name, regs- > hacha, eax);

retorno (0);};

static int fib_lookup_entry_handler (kretprobe_instance struct * ri, pt_regs struct * regs) {struct fib_result * resp;

resp = (struct fib_result *) regs- > dx; printk (" Calling :% s () \\ n ", RI- > RP > kp.symbol_name); * ((struct fib_result **) RI- > datos) = resp;

retorno (0); };


int fib_lookup_return_handler estático (kretprobe_instance struct * ri, pt_regs struct * regs) {struct fib_result * resp; int eax;

eax = regs- > ax &0xffff; resp = * ((fib_result struct **) RI- > datos); printk (" Volviendo: fib_lookup () con un retorno valor: 0x% lx (64 bits) 0x% x (32 bits), result- > Tipo:% d \\ n ", regs- > hacha, eax, resp- > tipo);

retorno ( 0);}

estática my_rp1 struct kretprobe = {.handler = return_handler, .entry_handler = entry_handler, .kp.symbol_name = " ip_route_input_slow "};


estático struct kretprobe my_rp2 = {.handler = return_handler, .entry_handler = entry_handler, .kp.symbol_name = " fib_validate_source "};


struct kretprobe my_rp3 estática = {.handler = fib_lookup_return_handler ,. entry_handler = fib_lookup_entry_handler, .kp.symbol_name = " fib_lookup ", .data_size = sizeof (struct fib_result *)};

static int init_myprobe __init (void) {int ret;

printk ( " RTN_UNICAST es% d \\ n ", RTN_UNICAST); if ((ret = register_jprobe (&my_jp1)) < 0) {printk (" register_jprobe% s fallidos, regresaron% d \\ n ", my_jp1.kp. symbol_name, ret); retorno (-1);}

if ((ret = register_jprobe (&my_jp2)) < 0) {printk (" regi ster_jprobe% s fallidos, regresaron% d \\ n ", my_jp2.kp.symbol_name, ret); retorno (-1);}

if ((ret = register_kretprobe (&my_rp1)) < 0) {printk (" register_kretprobe% s fallidos, regresado% d \\ n ", my_rp1.kp.symbol_name, ret); unregister_jprobe (&my_jp1); unregister_jprobe (&my_jp2); retorno (-1);}

if ((ret = register_kretprobe (&my_rp2)) < 0) {printk (" register_kretprobe% s fallidos, regresaron% d \\ n ", my_rp2.kp.symbol_name, ret); unregister_jprobe (&my_jp1 ); unregister_jprobe (&my_jp2); unregister_kretprobe (&my_rp1); retorno (-1);}

if ((ret = register_kretprobe (&my_rp3)) < 0) {printk (" register_kretprobe% s fallidos, regresaron% d \\ n ", my_rp3.kp.symbol_name, ret); unregister_jprobe (&my_jp1); unregister_jprobe (&my_jp2); unregister_kretprobe (&my_rp1); unregister_kretprobe (&my_rp2); regreso (-1);}

return 0;}

Copyright © Conocimiento de Windows All Rights Reserved