Trace function entry and return with caller function name and
visualize nested function calls in single shoot:

#define _trace_enter_exit_() char _caller[200];
lookup_symbol_name((unsigned
long)__builtin_return_address(0),_caller); \
        char __attribute__ ((cleanup(printk))) _ret_msg[100];
sprintf(_ret_msg, "%s < %s }\n", _caller, __func__); \
        printk("%s > %s { @ %s:%d\n", _caller, __func__, __FILE__, __LINE__);

For demonstration purpose add define _trace_enter_exit_  ONCE to
beginning of functions: rest_init, start_kernel, do_basic_setup,
run_init_process, kernel_init, kernel_init_freeable. Compile and run
kernel. Run dmesg and see results:

# dmesg  | grep  "[{}]"

[    0.000000]  > start_kernel { @ init/main.c:471
[    0.071838] start_kernel > rest_init { @ init/main.c:363
[    0.072387] ret_from_fork > kernel_init { @ init/main.c:810
[    0.072418] ret_from_fork > kernel_init_freeable { @ init/main.c:856
[    0.143615] ret_from_fork > do_basic_setup { @ init/main.c:780
[    0.151397] ret_from_fork > do_initcalls { @ init/main.c:765
[    1.902526] ret_from_fork < do_initcalls }
[    1.906860] ret_from_fork < do_basic_setup }
[    6.504058] ret_from_fork < kernel_init_freeable }
[    6.513244] kernel_init > run_init_process { @ init/main.c:802
[    6.554626] kernel_init < run_init_process }
[    6.559112] ret_from_fork < kernel_init }

Bonus: You can highlight or jump between corresponding entry "{" and
return "}" in smart editor if nested braces are synchronized. For
example you jump or highlight entry "{" and return "}" of kernel_init.

-- 
Constantine Shulyupin
http://www.MakeLinux.com/
Embedded Linux Systems,
Device Drivers, TI DaVinci
_______________________________________________
Celinux-dev mailing list
Celinux-dev@lists.celinuxforum.org
https://lists.celinuxforum.org/mailman/listinfo/celinux-dev

Reply via email to