Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

The following are examples of sh_flow.d.

This is a simple script to trace the flow of Bourne shell functions, 
builtins and external commands. Here it traces the example program,
Code/Shell/func_abc.sh.

   # sh_flow.d 
     C TIME(us)         FILE             -- NAME
     0 3060274370505    func_abc.sh      -> func_a
     0 3060274370529    func_abc.sh        > echo
     0 3060274372742    func_abc.sh        | sleep
     0 3060275381634    func_abc.sh        -> func_b
     0 3060275381660    func_abc.sh          > echo
     0 3060275383852    func_abc.sh          | sleep
     0 3060276391653    func_abc.sh          -> func_c
     0 3060276391679    func_abc.sh            > echo
     0 3060276393671    func_abc.sh            | sleep
     0 3060277401753    func_abc.sh          <- func_c
     0 3060277401767    func_abc.sh        <- func_b
     0 3060277401775    func_abc.sh      <- func_a
   ^C

As each function is entered, the third column is indented by 2 spaces. This
shows which function is calling who - the output abovebegins by showing that
func_a() began, and then called func_b().

If the output looks shuffled, check the CPU "C" and "TIME" columns, and 
post sort based on TIME if necessary.

See Notes/ALLflow_notes.txt for important notes about reading flow outputs.



The following traces the firefox startup script.

# sh_flow.d
  C TIME(us)         FILE             -- NAME
  0 3060321598138    firefox          > test
  0 3060321603730    firefox          > [
  0 3060321603796    firefox          > cd
  0 3060321603878    firefox          > [
  0 3060321603900    firefox          > [
  0 3060321604099    firefox          > [
  0 3060321609050    firefox          > echo
  0 3060321620601    firefox          > echo
  0 3060321626369    firefox          > [
  0 3060321626432    firefox          > export
  0 3060321626459    firefox          -> moz_pis_startstop_scripts
  0 3060321626519    firefox            > export
  0 3060321626966    firefox            > [
  0 3060321627031    firefox            > .
  0 3060321628446    firefox            -> moz_spc_verbose_echo
  0 3060321628458    firefox              > :
  0 3060321628467    firefox            <- moz_spc_verbose_echo
  0 3060321636461    firefox            > [
  0 3060321636738    firefox            -> moz_spc_verbose_echo
  0 3060321636751    firefox              > :
  0 3060321636760    firefox            <- moz_spc_verbose_echo
  0 3060321636778    firefox            > [
  0 3060321636793    firefox            > [
  0 3060321636817    firefox            > [
  0 3060321637126    firefox            -> moz_spc_verbose_echo
  0 3060321637136    firefox              > :
  0 3060321637143    firefox            <- moz_spc_verbose_echo
  0 3060321666922    firefox            -> moz_spc_verbose_echo
  0 3060321666952    firefox              > :
  0 3060321666964    firefox            <- moz_spc_verbose_echo
  0 3060321674929    firefox          > [
  0 3060321680246    firefox            > [
  0 3060321680312    firefox            -> moz_spc_verbose_echo
  0 3060321680323    firefox              > :
  0 3060321680331    firefox            <- moz_spc_verbose_echo
  0 3060321680356    firefox            -> moz_spc_verbose_echo
  0 3060321680363    firefox              > :
  0 3060321680370    firefox            <- moz_spc_verbose_echo
  0 3060321680396    firefox            > [
  0 3060321680428    firefox          <- moz_pis_startstop_scripts
  0 3060321680525    firefox          > [
  0 3060321680580    firefox          > [
  0 3060321685358    firefox          | /usr/lib/firefox/run-mozilla.sh
  0 3060321700731    run-mozilla.sh   > [
  0 3060321700950    run-mozilla.sh   > break
  0 3060321703259    run-mozilla.sh   > [
  0 3060321703292    run-mozilla.sh   > shift
  0 3060321703382    run-mozilla.sh   > [
  0 3060321703421    run-mozilla.sh   > [
  0 3060321703493    run-mozilla.sh   > [
  0 3060321703642    run-mozilla.sh   > [
  0 3060321703669    run-mozilla.sh   > export
  0 3060321703706    run-mozilla.sh   > [
  0 3060321703725    run-mozilla.sh   > [
  0 3060321703857    run-mozilla.sh   > [
  0 3060321703880    run-mozilla.sh   > export
  0 3060321703925    run-mozilla.sh   > export
  0 3060321703954    run-mozilla.sh   > [
  0 3060321703982    run-mozilla.sh   -> moz_run_program
  0 3060321704013    run-mozilla.sh     > [
  0 3060321704049    run-mozilla.sh     -> moz_test_binary
  0 3060321704065    run-mozilla.sh       > [
  0 3060321704097    run-mozilla.sh       > [
  0 3060321704127    run-mozilla.sh       > return
  0 3060321704137    run-mozilla.sh     <- moz_test_binary
  0 3060321704151    run-mozilla.sh     > [
  0 3060321709953    run-mozilla.sh   > type
  0 3060321724260    run-mozilla.sh     > [
  0 3060321724559    run-mozilla.sh     > [
  0 3060321724574    run-mozilla.sh     > [
  0 3060321727396    run-mozilla.sh     | /usr/lib/firefox/firefox-bin
  0 3060325513871    run-mozilla.sh     > [
  0 3060325513898    run-mozilla.sh     > [
  0 3060325513929    run-mozilla.sh     > [
  0 3060325513940    run-mozilla.sh   <- moz_run_program
  0 3060325513967    run-mozilla.sh   > exit
  0 3060325515113    firefox          -> moz_pis_startstop_scripts
  0 3060325515189    firefox            > export
  0 3060325515431    firefox            > [
  0 3060325515466    firefox            > [
  0 3060325515487    firefox          <- moz_pis_startstop_scripts
  0 3060325515503    firefox          > exit

This shows the flow, incluing the handover between the "firefox" script
and the "run-mozilla.sh" script.

There is a point in the output where flow appears to reverse (at time
3060321709953, with the entry "> type"). This is due to another instance
of the run-mozilla.sh script running, which is indistinguishable from
the other lines in the output. To confirm this for yourself, add a PID
column to the flow script (or use sh_flowinfo.d).