(command.CommandList
  children: [
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:tracing)
          op: assign_op.Equal
          rhs: {<'/sys/kernel/debug/tracing'>}
          spids: [187]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:flock)
                  op: assign_op.Equal
                  rhs: {<'/var/tmp/.ftrace-lock'>}
                  spids: [190]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:wroteflock)
              op: assign_op.Equal
              rhs: {<0>}
              spids: [194]
            )
          ]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_duration)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [197]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:duration)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [201]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_pid)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [204]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:pid)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [208]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_tid)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [211]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:tid)
              op: assign_op.Equal
              rhs: (word.Empty)
              spids: [215]
            )
          ]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_filter)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [217]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:filter)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [221]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_view)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [224]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_headers)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [228]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_stack)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [232]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:dmesg)
              op: assign_op.Equal
              rhs: {<2>}
              spids: [236]
            )
          ]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:debug)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [239]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_force)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [243]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_list)
                  op: assign_op.Equal
                  rhs: {<0>}
                  spids: [247]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:target)
              op: assign_op.Equal
              rhs: (word.Empty)
              spids: [251]
            )
          ]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PATH)
          op: assign_op.Equal
          rhs: 
            {($ Id.VSub_DollarName '$PATH') <Id.Lit_Colon ':'> <'/usr/bin'> <Id.Lit_Colon ':'> <'/sbin'>}
          spids: [253]
        )
      ]
    )
    (C {<trap>} {(SQ <':'>)} {<INT>} {<QUIT>} {<TERM>} {<PIPE>} {<HUP>})
    (command.ShFunction
      name: usage
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DLessDash '<<-'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<END>}
                      here_end_span_id: 340
                      stdin_parts: [
                        <'USAGE: uprobe [-FhHsv] [-d secs] [-p PID] [-L TID] {-l target |\n'>
                        <'              uprobe_definition [filter]}\n'>
                        <'                 -F              # force. trace despite warnings.\n'>
                        <'                 -d seconds      # trace duration, and use buffers\n'>
                        <'                 -l target       # list functions from this executable\n'>
                        <'                 -p PID          # PID to match on events\n'>
                        <'                 -L TID          # thread id to match on events\n'>
                        <'                 -v              # view format file (don\'t trace)\n'>
                        <'                 -H              # include column headers\n'>
                        <'                 -s              # show user stack traces\n'>
                        <'                 -h              # this usage message\n'>
                        <'\n'>
                        <'Note that these examples may need modification to match your kernel\n'>
                        <'version\'s function names and platform\'s register usage.\n'>
                        <'   eg,\n'>
                        <'       # trace readline() calls in all running '>
                        <Id.Right_DoubleQuote '"'>
                        <bash>
                        <Id.Right_DoubleQuote '"'>
                        <' executables:\n'>
                        <'           uprobe p:bash:readline\n'>
                        <'       # trace readline() with explicit executable path:\n'>
                        <'           uprobe p:/bin/bash:readline\n'>
                        <'       # trace the return of readline() with return value as a string:\n'>
                        <'           uprobe \'r:bash:readline +0('>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\$'>
                        )
                        <'retval):string\'\n'>
                        <'       # trace sleep() calls in all running libc shared libraries:\n'>
                        <'           uprobe p:libc:sleep\n'>
                        <'       # trace sleep() with register %di (x86):\n'>
                        <'           uprobe \'p:libc:sleep %di\'\n'>
                        <
'       # trace this address (use caution: must be instruction aligned):\n'
                        >
                        <'           uprobe p:libc:0xbf130\n'>
                        <'       # trace gettimeofday() for PID 1182 only:\n'>
                        <'           uprobe -p 1182 p:libc:gettimeofday\n'>
                        <'       # trace the return of fopen() only when it returns NULL:\n'>
                        <'           uprobe \'r:libc:fopen file='>
                        (word_part.EscapedLiteral
                          token: <Id.Lit_EscapedChar '\\$'>
                        )
                        <'retval\' \'file == 0\'\n'>
                        <'\n'>
                        <'See the man page and example file for more info.\n'>
                      ]
                    )
                )
                (redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})
              ]
              do_fork: T
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit>)
          ]
        )
    )
    (command.ShFunction
      name: warn
      body: 
        (BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [(C {<eval>} {(DQ ($ Id.VSub_At '$@'))})]
                              negated: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.Simple
                      words: [
                        {<echo>}
                        {
                          (DQ <'WARNING: command failed '> 
                            (word_part.EscapedLiteral
                              token: <Id.Lit_EscapedChar '\\"'>
                            ) ($ Id.VSub_At '$@') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>)
                          )
                        }
                      ]
                      redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
                      do_fork: T
                    )
                  ]
                  spids: [354 365]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: end
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<echo>}]
              redirects: [(redir op:<Id.Redir_Great '2>'> loc:(redir_loc.Fd fd:2) arg:{<'/dev/null'>})]
              do_fork: T
            )
            (command.Simple
              words: [{<echo>} {(DQ <'Ending tracing...'>)}]
              redirects: [(redir op:<Id.Redir_Great '2>'> loc:(redir_loc.Fd fd:2) arg:{<'/dev/null'>})]
              do_fork: T
            )
            (C {<cd>} {($ Id.VSub_DollarName '$tracing')})
            (C {<warn>} {(DQ <'echo 0 > events/uprobes/'> ($ Id.VSub_DollarName '$uname') <'/enable'>)})
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: (command.DParen child:<Id.Lit_ArithVarLike opt_filter>)
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<warn>} 
                      {(DQ <'echo 0 > events/uprobes/'> ($ Id.VSub_DollarName '$uname') <'/filter'>)}
                    )
                  ]
                  spids: [427 437]
                )
              ]
            )
            (C {<warn>} {(DQ <'echo -:'> ($ Id.VSub_DollarName '$uname') <' >> uprobe_events'>)})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.DParen child:<Id.Lit_ArithVarLike opt_stack>)
                (C {<warn>} {(DQ <'echo 0 > options/userstacktrace'>)})
              ]
            )
            (C {<warn>} {(DQ <'echo > trace'>)})
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.DParen child:<Id.Lit_ArithVarLike wroteflock>)
                (C {<warn>} {(DQ <'rm '> ($ Id.VSub_DollarName '$flock'))})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: die
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<echo>} {(DQ ($ Id.VSub_At '$@'))}]
              redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
        )
    )
    (command.ShFunction
      name: edie
      body: 
        (BraceGroup
          children: [
            (command.Simple
              words: [{<echo>} {(DQ ($ Id.VSub_At '$@'))}]
              redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
            (command.Simple
              words: [{<exec>}]
              redirects: [
                (redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {<'/dev/null'>}
                )
                (redir op:<Id.Redir_GreatAnd '2>&'> loc:(redir_loc.Fd fd:2) arg:{<1>})
              ]
              do_fork: T
            )
            (C {<end>})
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
        )
    )
    (command.ShFunction
      name: set_path
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:name)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [574]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:path)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<which>} {($ Id.VSub_DollarName '$name')})
                      )
                    }
                  spids: [579]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_GlobDEqual
                                  left: {(DQ ($ Id.VSub_DollarName '$path'))}
                                  right: {(DQ )}
                                )
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:path)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: <Id.Left_DollarParen '$('>
                                child: 
                                  (command.Pipeline
                                    children: [
                                      (command.Simple
                                        words: [{<ldconfig>} {<-v>}]
                                        redirects: [
                                          (redir
                                            op: <Id.Redir_Great '2>'>
                                            loc: (redir_loc.Fd fd:2)
                                            arg: {<'/dev/null'>}
                                          )
                                        ]
                                        do_fork: T
                                      )
                                      (C {<awk>} {<-v>} 
                                        {<Id.Lit_VarLike 'lib='> ($ Id.VSub_DollarName '$name')} 
                                        {
                                          (SQ <'\n'> 
                                            <'\t\t    $1 ~ /:/ { sub(/:/, "", $1); path = $1 }\n'> <'\t\t    { sub(/\\..*/, "", $1); }\n'> <'\t\t    $1 == lib { print path "/" $3 }'>
                                          )
                                        }
                                      )
                                    ]
                                    negated: F
                                  )
                              )
                            }
                          spids: [606]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.DBracket
                                      expr: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_GlobDEqual
                                          left: {(DQ ($ Id.VSub_DollarName '$path'))}
                                          right: {(DQ )}
                                        )
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          action: [
                            (C {<die>} 
                              {
                                (DQ <'ERROR: segment '> 
                                  (word_part.EscapedLiteral
                                    token: <Id.Lit_EscapedChar '\\"'>
                                  ) ($ Id.VSub_DollarName '$name') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) 
                                  <' ambiguous.'>
                                )
                              } {(DQ <'Program or library? Try a full path.'>)}
                            )
                          ]
                          spids: [633 649]
                        )
                      ]
                    )
                  ]
                  spids: [587 603]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              expr: 
                                (bool_expr.LogicalNot
                                  child: 
                                    (bool_expr.Unary
                                      op_id: Id.BoolUnary_x
                                      child: {($ Id.VSub_DollarName '$path')}
                                    )
                                )
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<die>} 
                      {
                        (DQ <'ERROR: resolved '> 
                          (word_part.EscapedLiteral
                            token: <Id.Lit_EscapedChar '\\"'>
                          ) ($ Id.VSub_DollarName '$name') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' to '> 
                          (word_part.EscapedLiteral
                            token: <Id.Lit_EscapedChar '\\"'>
                          ) ($ Id.VSub_DollarName '$path') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) 
                          <', but file missing'>
                        )
                      }
                    )
                  ]
                  spids: [676 689]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: set_addr
      body: 
        (BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:path)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [719]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:name)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [723]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:sym)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$3')}
                  spids: [727]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.Binary
                      op_id: Id.BoolBinary_GlobDEqual
                      left: {(DQ ($ Id.VSub_DollarName '$path'))}
                      right: {(DQ )}
                    )
                )
                (C {<die>} {(DQ <'ERROR: missing symbol path.'>)})
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.Binary
                      op_id: Id.BoolBinary_GlobDEqual
                      left: {(DQ ($ Id.VSub_DollarName '$sym'))}
                      right: {(DQ )}
                    )
                )
                (C {<die>} {(DQ <'ERROR: missing symbol for '> ($ Id.VSub_DollarName '$path'))})
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:addr)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<objdump>} {<-tT>} {($ Id.VSub_DollarName '$path')})
                              (C {<awk>} {<-v>} {<Id.Lit_VarLike 'sym='> ($ Id.VSub_DollarName '$sym')} 
                                {
                                  (SQ <'\n'> <'\t    $NF == sym && $4 == ".text"  { print $1; exit }'>)
                                }
                              )
                            ]
                            negated: F
                          )
                      )
                    }
                  spids: [778]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.Binary
                      op_id: Id.BoolBinary_GlobDEqual
                      left: {(DQ ($ Id.VSub_DollarName '$addr'))}
                      right: {(DQ )}
                    )
                )
                (C {<die>} 
                  {
                    (DQ <'ERROR: missing symbol '> 
                      (word_part.EscapedLiteral
                        token: <Id.Lit_EscapedChar '\\"'>
                      ) ($ Id.VSub_DollarName '$sym') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' in '> 
                      ($ Id.VSub_DollarName '$path')
                    )
                  }
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.DParen
                  child: 
                    (arith_expr.Binary
                      op_id: Id.Arith_DEqual
                      left: {<Id.Lit_Digits 0> <Id.Lit_ArithVarLike x> ($ Id.VSub_DollarName '$addr')}
                      right: {<Id.Lit_Digits 0>}
                    )
                )
                (C {<die>} 
                  {
                    (DQ <'ERROR: failed resolving '> 
                      (word_part.EscapedLiteral
                        token: <Id.Lit_EscapedChar '\\"'>
                      ) ($ Id.VSub_DollarName '$sym') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <' in '> 
                      ($ Id.VSub_DollarName '$path') <.>
                    )
                  } {(DQ <'Maybe it exists in a different target (eg, library)?'>)}
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:addr)
                  op: assign_op.Equal
                  rhs: 
                    {<0x> 
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<printf>} {(DQ <'%x'>)} {<0x> ($ Id.VSub_DollarName '$addr')})
                      )
                    }
                  spids: [863]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:type)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<file>} {($ Id.VSub_DollarName '$path')})
                      )
                    }
                  spids: [883]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_GlobNEqual
                                  left: {(DQ ($ Id.VSub_DollarName '$type'))}
                                  right: 
                                    {<Id.Lit_Other '*'> <shared> <Id.Lit_Other '?'> <object> 
                                      <Id.Lit_Other '*'>
                                    }
                                )
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:base)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: <Id.Left_DollarParen '$('>
                                child: 
                                  (command.Pipeline
                                    children: [
                                      (C {<objdump>} {<-x>} {($ Id.VSub_DollarName '$path')})
                                      (C {<awk>} 
                                        {
                                          (SQ <'\n'> 
                                            <'\t\t    $1 == "LOAD" && $3 ~ /^[0x]*$/ { print $5 }'>
                                          )
                                        }
                                      )
                                    ]
                                    negated: F
                                  )
                              )
                            }
                          spids: [921]
                        )
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (command.DBracket
                          expr: 
                            (bool_expr.Binary
                              op_id: Id.BoolBinary_GlobNEqual
                              left: {(DQ ($ Id.VSub_DollarName '$base'))}
                              right: {<0x> <Id.Lit_Other '*'>}
                            )
                        )
                        (C {<die>} {(DQ <'ERROR: finding base load addr'>)} 
                          {(DQ <'for '> ($ Id.VSub_DollarName '$path') <.>)}
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:addr)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (word_part.ArithSub
                                anode: 
                                  (arith_expr.Binary
                                    op_id: Id.Arith_Minus
                                    left: <Id.Lit_ArithVarLike addr>
                                    right: <Id.Lit_ArithVarLike base>
                                  )
                              )
                            }
                          spids: [969]
                        )
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DAmp]
                      children: [
                        (command.DParen
                          child: 
                            (arith_expr.Binary
                              op_id: Id.Arith_Less
                              left: <Id.Lit_ArithVarLike addr>
                              right: {<Id.Lit_Digits 0>}
                            )
                        )
                        (C {<die>} 
                          {(DQ <'ERROR: transposed address for '> ($ Id.VSub_DollarName '$sym'))} {(DQ <'became negative: '> ($ Id.VSub_DollarName '$addr'))}
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:addr)
                          op: assign_op.Equal
                          rhs: 
                            {<0x> 
                              (command_sub
                                left_token: <Id.Left_DollarParen '$('>
                                child: (C {<printf>} {(DQ <'%x'>)} {($ Id.VSub_DollarName '$addr')})
                              )
                            }
                          spids: [1009]
                        )
                      ]
                    )
                  ]
                  spids: [891 910]
                )
              ]
            )
          ]
        )
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: 
        (condition.Shell
          commands: [
            (C {<getopts>} 
              {<Fd> <Id.Lit_Colon ':'> <hHl> <Id.Lit_Colon ':'> <p> <Id.Lit_Colon ':'> <L> 
                <Id.Lit_Colon ':'> <sv>
              } {<opt>}
            )
          ]
        )
      body: 
        (command.DoGroup
          children: [
            (command.Case
              to_match: {($ Id.VSub_DollarName '$opt')}
              arms: [
                (case_arm
                  pat_list: [{<F>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:opt_force)
                          op: assign_op.Equal
                          rhs: {<1>}
                          spids: [1060]
                        )
                      ]
                    )
                  ]
                  spids: [1057 1058 1063 -1]
                )
                (case_arm
                  pat_list: [{<d>}]
                  action: [
                    (command.Sentence
                      child: 
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:opt_duration)
                              op: assign_op.Equal
                              rhs: {<1>}
                              spids: [1069]
                            )
                          ]
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:duration)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$OPTARG')}
                          spids: [1073]
                        )
                      ]
                    )
                  ]
                  spids: [1066 1067 1076 -1]
                )
                (case_arm
                  pat_list: [{<p>}]
                  action: [
                    (command.Sentence
                      child: 
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:opt_pid)
                              op: assign_op.Equal
                              rhs: {<1>}
                              spids: [1082]
                            )
                          ]
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:pid)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$OPTARG')}
                          spids: [1086]
                        )
                      ]
                    )
                  ]
                  spids: [1079 1080 1089 -1]
                )
                (case_arm
                  pat_list: [{<L>}]
                  action: [
                    (command.Sentence
                      child: 
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:opt_tid)
                              op: assign_op.Equal
                              rhs: {<1>}
                              spids: [1095]
                            )
                          ]
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:tid)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$OPTARG')}
                          spids: [1099]
                        )
                      ]
                    )
                  ]
                  spids: [1092 1093 1102 -1]
                )
                (case_arm
                  pat_list: [{<l>}]
                  action: [
                    (command.Sentence
                      child: 
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:opt_list)
                              op: assign_op.Equal
                              rhs: {<1>}
                              spids: [1108]
                            )
                          ]
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:target)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$OPTARG')}
                          spids: [1112]
                        )
                      ]
                    )
                  ]
                  spids: [1105 1106 1115 -1]
                )
                (case_arm
                  pat_list: [{<H>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:opt_headers)
                          op: assign_op.Equal
                          rhs: {<1>}
                          spids: [1121]
                        )
                      ]
                    )
                  ]
                  spids: [1118 1119 1124 -1]
                )
                (case_arm
                  pat_list: [{<s>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:opt_stack)
                          op: assign_op.Equal
                          rhs: {<1>}
                          spids: [1130]
                        )
                      ]
                    )
                  ]
                  spids: [1127 1128 1133 -1]
                )
                (case_arm
                  pat_list: [{<v>}]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:opt_view)
                          op: assign_op.Equal
                          rhs: {<1>}
                          spids: [1139]
                        )
                      ]
                    )
                  ]
                  spids: [1136 1137 1142 -1]
                )
                (case_arm
                  pat_list: [{<h>} {<Id.Lit_QMark '?'>}]
                  action: [(C {<usage>})]
                  spids: [1145 1148 1152 -1]
                )
              ]
            )
          ]
        )
    )
    (C {<shift>} 
      {
        (word_part.ArithSub
          anode: 
            (arith_expr.Binary
              op_id: Id.Arith_Minus
              left: {($ Id.VSub_DollarName '$OPTIND')}
              right: {<Id.Lit_Digits 1>}
            )
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uprobe)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$1')}
          spids: [1172]
        )
      ]
    )
    (C {<shift>})
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: (command.DParen child:{($ Id.VSub_Pound '$#')})
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_filter)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [1190]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:filter)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [1194]
                )
              ]
            )
          ]
          spids: [1177 1187]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.DBracket
          expr: 
            (bool_expr.LogicalAnd
              left: 
                (bool_expr.Binary
                  op_id: Id.BoolBinary_GlobDEqual
                  left: {(DQ ($ Id.VSub_DollarName '$opt_list'))}
                  right: {<1>}
                )
              right: 
                (bool_expr.Binary
                  op_id: Id.BoolBinary_GlobNEqual
                  left: {(DQ ($ Id.VSub_DollarName '$uprobe'))}
                  right: {(DQ )}
                )
            )
        )
        (C {<die>} {(DQ <'ERROR: -l takes a target only'>)})
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: (command.DParen child:<Id.Lit_ArithVarLike opt_list>)
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_GlobNEqual
                                  left: {(DQ ($ Id.VSub_DollarName '$target'))}
                                  right: {<Id.Lit_Other '*'> <'/'> <Id.Lit_Other '*'>}
                                )
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<set_path>} {($ Id.VSub_DollarName '$target')})
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:target)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName '$path')}
                          spids: [1272]
                        )
                      ]
                    )
                  ]
                  spids: [1247 1264]
                )
              ]
            )
            (command.Pipeline
              children: [
                (C {<objdump>} {<-tT>} {($ Id.VSub_DollarName '$target')})
                (C {<awk>} {(SQ <'$4 == ".text" { print $NF }'>)})
                (C {<sort>})
                (C {<uniq>})
              ]
              negated: F
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit>)
          ]
          spids: [1234 1244]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ver)
          op: assign_op.Equal
          rhs: {(command_sub left_token:<Id.Left_DollarParen '$('> child:(C {<uname>} {<-r>}))}
          spids: [1310]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:maj)
          op: assign_op.Equal
          rhs: 
            {
              (braced_var_sub
                token: <Id.VSub_Name ver>
                suffix_op: 
                  (suffix_op.Unary
                    tok: <Id.VOp1_DPercent '%%'>
                    arg_word: {<.> <Id.Lit_Other '*'>}
                  )
              )
            }
          spids: [1317]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.DParen
                      child: 
                        (arith_expr.Binary
                          op_id: Id.Arith_DAmp
                          left: 
                            (arith_expr.Binary
                              op_id: Id.Arith_DEqual
                              left: <Id.Lit_ArithVarLike opt_force>
                              right: {<Id.Lit_Digits 0>}
                            )
                          right: 
                            (arith_expr.Binary
                              op_id: Id.Arith_Less
                              left: {($ Id.VSub_DollarName '$maj')}
                              right: {<Id.Lit_Digits 4>}
                            )
                        )
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DLessDash '<<-'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.HereDoc
                      here_begin: {<END>}
                      here_end_span_id: 1367
                      stdin_parts: [
                        <'ERROR: Kernel version >= 4.0 preferred (you have '>
                        ($ Id.VSub_DollarName '$ver')
                        <'). Aborting.\n'>
                        <'\n'>
                        <
'Background: uprobes were first added in 3.5. I\'ve tested them on 3.13,\n'
                        >
                        <
'and found them unsafe, as they can crash or lock up processes, which can\n'
                        >
                        <'effectively lock up the system. On 4.0, uprobes seem much safer. You\n'>
                        <'can use -F to force tracing, but you\'ve been warned.\n'>
                      ]
                    )
                )
                (redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})
              ]
              do_fork: T
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit>)
          ]
          spids: [1325 1347]
        )
      ]
    )
    (command.ForEach
      iter_names: [cmd]
      iterable: (for_iter.Words words:[{<file>} {<objdump>} {<ldconfig>} {<awk>}])
      body: 
        (command.DoGroup
          children: [
            (command.Simple
              words: [{<which>} {($ Id.VSub_DollarName '$cmd')}]
              redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'/dev/null'>})]
              do_fork: T
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.DParen
                  child: 
                    (arith_expr.Binary
                      op_id: Id.Arith_NEqual
                      left: {($ Id.VSub_QMark '$?')}
                      right: {<Id.Lit_Digits 0>}
                    )
                )
                (C {<die>} 
                  {
                    (DQ <'ERROR: missing '> ($ Id.VSub_DollarName '$cmd') <' in '> 
                      (word_part.EscapedLiteral
                        token: <Id.Lit_EscapedChar '\\$'>
                      ) <'PATH. '> ($ Id.VSub_Number '$0') <' needs'>
                    )
                  } {(DQ <'to use this command. Exiting.'>)}
                )
              ]
            )
          ]
        )
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.DBracket
          expr: 
            (bool_expr.Binary
              op_id: Id.BoolBinary_GlobDEqual
              left: {(DQ ($ Id.VSub_DollarName '$uprobe'))}
              right: {(DQ )}
            )
        )
        (C {<usage>})
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.DParen
          child: 
            (arith_expr.Binary
              op_id: Id.Arith_Great
              left: 
                (arith_expr.Binary
                  op_id: Id.Arith_Plus
                  left: 
                    (arith_expr.Binary
                      op_id: Id.Arith_Plus
                      left: <Id.Lit_ArithVarLike opt_pid>
                      right: <Id.Lit_ArithVarLike opt_filter>
                    )
                  right: <Id.Lit_ArithVarLike opt_tid>
                )
              right: {<Id.Lit_Digits 1>}
            )
        )
        (C {<die>} {(DQ <'ERROR: use at most one of -p, -L, or filter.'>)})
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.DParen
          child: 
            (arith_expr.Binary
              op_id: Id.Arith_DAmp
              left: <Id.Lit_ArithVarLike opt_duration>
              right: <Id.Lit_ArithVarLike opt_view>
            )
        )
        (C {<die>} {(DQ <'ERROR: use either -d or -v.'>)})
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: (command.DParen child:<Id.Lit_ArithVarLike opt_pid>)
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_filter)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [1523]
                )
              ]
            )
            (command.ForEach
              iter_names: [tid]
              iterable: 
                (for_iter.Words
                  words: [{<'/proc/'> ($ Id.VSub_DollarName '$pid') <'/task/'> <Id.Lit_Star '*'>}]
                )
              body: 
                (command.DoGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:filter)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ ($ Id.VSub_DollarName '$filter') <' || common_pid == '> 
                                (braced_var_sub
                                  token: <Id.VSub_Name tid>
                                  suffix_op: 
                                    (suffix_op.Unary
                                      tok: <Id.VOp1_DPound '##'>
                                      arg_word: {<Id.Lit_Other '*'> <Id.Lit_Slash '/'>}
                                    )
                                )
                              )
                            }
                          spids: [1546]
                        )
                      ]
                    )
                  ]
                )
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:filter)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: <Id.VSub_Name filter>
                        suffix_op: (suffix_op.Slice begin:{<Id.Lit_Digits 3>})
                      )
                    }
                  spids: [1562]
                )
              ]
            )
          ]
          spids: [1506 1516]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: (command.DParen child:<Id.Lit_ArithVarLike opt_tid>)
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:opt_filter)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [1587]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:filter)
                  op: assign_op.Equal
                  rhs: {(DQ <'common_pid == '> ($ Id.VSub_DollarName '$tid'))}
                  spids: [1591]
                )
              ]
            )
          ]
          spids: [1574 1584]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.DBracket
                      expr: 
                        (bool_expr.LogicalAnd
                          left: 
                            (bool_expr.Binary
                              op_id: Id.BoolBinary_GlobNEqual
                              left: {(DQ ($ Id.VSub_DollarName '$uprobe'))}
                              right: {<p> <Id.Lit_Colon ':'> <Id.Lit_Other '*'>}
                            )
                          right: 
                            (bool_expr.Binary
                              op_id: Id.BoolBinary_GlobNEqual
                              left: {(DQ ($ Id.VSub_DollarName '$uprobe'))}
                              right: {<r> <Id.Lit_Colon ':'> <Id.Lit_Other '*'>}
                            )
                        )
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.Simple
              words: [{<echo>} {(DQ <'ERROR: invalid uprobe definition (should start with p: or r:)'>)}]
              redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
            (C {<usage>})
          ]
          spids: [1599 1628]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:utype)
          op: assign_op.Equal
          rhs: 
            {
              (braced_var_sub
                token: <Id.VSub_Name uprobe>
                suffix_op: 
                  (suffix_op.Unary
                    tok: <Id.VOp1_DPercent '%%'>
                    arg_word: {<':'> <Id.Lit_Other '*'>}
                  )
              )
            }
          spids: [1696]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:urest)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: <Id.VSub_Name uprobe>
                  suffix_op: 
                    (suffix_op.Unary
                      tok: <Id.VOp1_Pound '#'>
                      arg_word: {<Id.Lit_Other '*'> <':'>}
                    )
                ) <' '>
              )
            }
          spids: [1704]
        )
      ]
    )
    (C {<set>} {<-->} {($ Id.VSub_DollarName '$urest')})
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.DBracket
                      expr: 
                        (bool_expr.Binary
                          op_id: Id.BoolBinary_GlobDEqual
                          left: {($ Id.VSub_Number '$1')}
                          right: {<Id.Lit_Other '*'> <Id.Lit_Colon ':'> <Id.Lit_Other '*'>}
                        )
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.Sentence
              child: 
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:uname)
                      op: assign_op.Equal
                      rhs: (word.Empty)
                      spids: [1739]
                    )
                  ]
                )
              terminator: <Id.Op_Semi _>
            )
            (command.Sentence
              child: 
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:probe)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_Number '$1')}
                      spids: [1742]
                    )
                  ]
                )
              terminator: <Id.Op_Semi _>
            )
            (command.Sentence child:(C {<shift>}) terminator:<Id.Op_Semi _>)
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:uargs)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_At '$@'))}
                  spids: [1749]
                )
              ]
            )
          ]
          spids: [1721 1736]
        )
      ]
      else_action: [
        (command.AndOr
          ops: [Id.Op_DAmp]
          children: [
            (command.DBracket
              expr: 
                (bool_expr.Binary
                  op_id: Id.BoolBinary_GlobNEqual
                  left: {($ Id.VSub_Number '$2')}
                  right: {<Id.Lit_Other '*'> <Id.Lit_Colon ':'> <Id.Lit_Other '*'>}
                )
            )
            (C {<die>} {(DQ <'ERROR: invalid probe. See usage (-h).'>)})
          ]
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:uname)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [1778]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:probe)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$2')}
                  spids: [1782]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.Sentence child:(C {<shift>} {<2>}) terminator:<Id.Op_Semi _>)
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:uargs)
              op: assign_op.Equal
              rhs: {(DQ ($ Id.VSub_At '$@'))}
              spids: [1791]
            )
          ]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:path)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_DollarName '$probe')}
                  spids: [1798]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:path)
              op: assign_op.Equal
              rhs: 
                {
                  (braced_var_sub
                    token: <Id.VSub_Name path>
                    suffix_op: 
                      (suffix_op.Unary
                        tok: <Id.VOp1_DPercent '%%'>
                        arg_word: {<':'> <Id.Lit_Other '*'>}
                      )
                  )
                }
              spids: [1802]
            )
          ]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:addr)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_DollarName '$probe')}
                  spids: [1810]
                )
              ]
            )
          terminator: <Id.Op_Semi _>
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:addr)
              op: assign_op.Equal
              rhs: 
                {
                  (braced_var_sub
                    token: <Id.VSub_Name addr>
                    suffix_op: 
                      (suffix_op.Unary
                        tok: <Id.VOp1_DPound '##'>
                        arg_word: {<Id.Lit_Other '*'> <':'>}
                      )
                  )
                }
              spids: [1814]
            )
          ]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.DBracket
                      expr: 
                        (bool_expr.Binary
                          op_id: Id.BoolBinary_GlobDEqual
                          left: {($ Id.VSub_DollarName '$path')}
                          right: {<Id.Lit_Other '*'> <'/'> <Id.Lit_Other '*'>}
                        )
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:seg)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: <Id.VSub_Name path>
                        suffix_op: 
                          (suffix_op.Unary
                            tok: <Id.VOp1_DPound '##'>
                            arg_word: {<Id.Lit_Other '*'> <Id.Lit_Slash '/'>}
                          )
                      )
                    }
                  spids: [1844]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:seg)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: <Id.VSub_Name seg>
                        suffix_op: 
                          (suffix_op.Unary
                            tok: <Id.VOp1_DPercent '%%'>
                            arg_word: {<.> <Id.Lit_Other '*'>}
                          )
                      )
                    }
                  spids: [1853]
                )
              ]
            )
          ]
          spids: [1826 1841]
        )
      ]
      else_action: [
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:seg)
              op: assign_op.Equal
              rhs: {($ Id.VSub_DollarName '$path')}
              spids: [1864]
            )
          ]
        )
        (C {<set_path>} {($ Id.VSub_DollarName '$path')})
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.DBracket
                      expr: 
                        (bool_expr.Binary
                          op_id: Id.BoolBinary_GlobDEqual
                          left: {(DQ ($ Id.VSub_DollarName '$addr'))}
                          right: {<0x> <Id.Lit_Other '*'>}
                        )
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.Binary
                      op_id: Id.BoolBinary_GlobDEqual
                      left: {(DQ ($ Id.VSub_DollarName '$uname'))}
                      right: {(DQ )}
                    )
                )
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name name:uname)
                      op: assign_op.Equal
                      rhs: 
                        {(${ Id.VSub_Name seg) <Id.Lit_Underscore _> ($ Id.VSub_DollarName '$addr')}
                      spids: [1920]
                    )
                  ]
                )
              ]
            )
          ]
          spids: [1882 1898]
        )
      ]
      else_action: [
        (command.AndOr
          ops: [Id.Op_DAmp]
          children: [
            (command.DBracket
              expr: 
                (bool_expr.Binary
                  op_id: Id.BoolBinary_GlobDEqual
                  left: {(DQ ($ Id.VSub_DollarName '$uname'))}
                  right: {(DQ )}
                )
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:uname)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_DollarName '$addr')}
                  spids: [1945]
                )
              ]
            )
          ]
        )
        (C {<set_addr>} {($ Id.VSub_DollarName '$path')} {($ Id.VSub_DollarName '$seg')} 
          {($ Id.VSub_DollarName '$addr')}
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:uprobe)
          op: assign_op.Equal
          rhs: 
            {
              (DQ ($ Id.VSub_DollarName '$utype') <':'> ($ Id.VSub_DollarName '$uname') <' '> 
                ($ Id.VSub_DollarName '$path') <':'> ($ Id.VSub_DollarName '$addr')
              )
            }
          spids: [1963]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.DBracket
          expr: 
            (bool_expr.Binary
              op_id: Id.BoolBinary_GlobNEqual
              left: {(DQ ($ Id.VSub_DollarName '$uargs'))}
              right: {(DQ )}
            )
        )
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:uprobe)
              op: assign_op.Equal
              rhs: {(DQ ($ Id.VSub_DollarName '$uprobe') <' '> ($ Id.VSub_DollarName '$uargs'))}
              spids: [1989]
            )
          ]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: (command.DParen child:<Id.Lit_ArithVarLike debug>)
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (C {<echo>} 
              {
                (DQ <'uname: '> (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) 
                  ($ Id.VSub_DollarName '$uname') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <', uprobe: '> 
                  (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) ($ Id.VSub_DollarName '$uprobe') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>)
                )
              }
            )
          ]
          spids: [1997 2007]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {<cd>} {($ Id.VSub_DollarName '$tracing')})
        (C {<die>} 
          {
            (DQ <'ERROR: accessing tracing. Root user? Kernel has FTRACE?\n'> 
              <'    debugfs mounted? (mount -t debugfs debugfs /sys/kernel/debug)'>
            )
          }
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.DParen
                      child: 
                        (arith_expr.Unary
                          op_id: Id.Arith_Bang
                          child: <Id.Lit_ArithVarLike opt_view>
                        )
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: (command.DParen child:<Id.Lit_ArithVarLike opt_duration>)
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (C {<echo>} 
                      {
                        (DQ <'Tracing uprobe '> ($ Id.VSub_DollarName '$uname') <' for '> 
                          ($ Id.VSub_DollarName '$duration') <' seconds (buffered)...'>
                        )
                      }
                    )
                  ]
                  spids: [2057 2067]
                )
              ]
              else_action: [
                (C {<echo>} 
                  {
                    (DQ <'Tracing uprobe '> ($ Id.VSub_DollarName '$uname') <' ('> 
                      ($ Id.VSub_DollarName '$uprobe') <'). Ctrl-C to end.'>
                    )
                  }
                )
              ]
            )
          ]
          spids: [2043 2054]
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (command.DBracket
          expr: (bool_expr.Unary op_id:Id.BoolUnary_e child:{($ Id.VSub_DollarName '$flock')})
        )
        (C {<die>} 
          {
            (DQ <'ERROR: ftrace may be in use by PID '> 
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<cat>} {($ Id.VSub_DollarName '$flock')})
              ) <' '> ($ Id.VSub_DollarName '$flock')
            )
          }
        )
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (command.Simple
          words: [{<echo>} {($ Id.VSub_Dollar '$$')}]
          redirects: [
            (redir
              op: <Id.Redir_Great '>'>
              loc: (redir_loc.Fd fd:1)
              arg: {($ Id.VSub_DollarName '$flock')}
            )
          ]
          do_fork: T
        )
        (C {<die>} {(DQ <'ERROR: unable to write '> ($ Id.VSub_DollarName '$flock') <.>)})
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:wroteflock)
          op: assign_op.Equal
          rhs: {<1>}
          spids: [2144]
        )
      ]
    )
    (command.Simple
      words: [{<echo>} {<nop>}]
      redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<current_tracer>})]
      do_fork: T
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.Pipeline
                      children: [
                        (command.Simple
                          words: [{<echo>} {(DQ ($ Id.VSub_DollarName '$uprobe'))}]
                          redirects: [
                            (redir
                              op: <Id.Redir_DGreat '>>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<uprobe_events>}
                            )
                          ]
                          do_fork: T
                        )
                      ]
                      negated: T
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.Simple
              words: [
                {<echo>}
                {
                  (DQ <'ERROR: adding uprobe '> 
                    (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) ($ Id.VSub_DollarName '$uprobe') (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'>) <.>
                  )
                }
              ]
              redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: (command.DParen child:<Id.Lit_ArithVarLike dmesg>)
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [
                    (command.Simple
                      words: [
                        {<echo>}
                        {
                          (DQ <'Last '> ($ Id.VSub_DollarName '$dmesg') 
                            <' dmesg entries (might contain reason):'>
                          )
                        }
                      ]
                      redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
                      do_fork: T
                    )
                    (command.Pipeline
                      children: [
                        (C {<dmesg>})
                        (C {<tail>} {<-> ($ Id.VSub_DollarName '$dmesg')})
                        (C {<sed>} {(SQ <'s/^/    /'>)})
                      ]
                      negated: F
                    )
                  ]
                  spids: [2191 2201]
                )
              ]
            )
            (C {<edie>} {(DQ <Exiting.>)})
          ]
          spids: [2159 2174]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: (command.DParen child:<Id.Lit_ArithVarLike opt_view>)
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (C {<cat>} {<'events/uprobes/'> ($ Id.VSub_DollarName '$uname') <'/format'>})
            (C {<edie>} {(DQ )})
          ]
          spids: [2245 2255]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: (command.DParen child:<Id.Lit_ArithVarLike opt_filter>)
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [
                                (command.Simple
                                  words: [{<echo>} {(DQ ($ Id.VSub_DollarName '$filter'))}]
                                  redirects: [
                                    (redir
                                      op: <Id.Redir_Great '>'>
                                      loc: (redir_loc.Fd fd:1)
                                      arg: 
                                        {<'events/uprobes/'> ($ Id.VSub_DollarName '$uname') 
                                          <'/filter'>
                                        }
                                    )
                                  ]
                                  do_fork: T
                                )
                              ]
                              negated: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [(C {<edie>} {(DQ <'ERROR: setting filter or -p. Exiting.'>)})]
                  spids: [2285 2302]
                )
              ]
            )
          ]
          spids: [2272 2282]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: (command.DParen child:<Id.Lit_ArithVarLike opt_stack>)
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [
                                (command.Simple
                                  words: [{<echo>} {<1>}]
                                  redirects: [
                                    (redir
                                      op: <Id.Redir_Great '>'>
                                      loc: (redir_loc.Fd fd:1)
                                      arg: {<'options/userstacktrace'>}
                                    )
                                  ]
                                  do_fork: T
                                )
                              ]
                              negated: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [(C {<edie>} {(DQ <'ERROR: enabling stack traces (-s). Exiting'>)})]
                  spids: [2329 2342]
                )
              ]
            )
          ]
          spids: [2316 2326]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.Pipeline
                      children: [
                        (command.Simple
                          words: [{<echo>} {<1>}]
                          redirects: [
                            (redir
                              op: <Id.Redir_Great '>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<'events/uprobes/'> ($ Id.VSub_DollarName '$uname') <'/enable'>}
                            )
                          ]
                          do_fork: T
                        )
                      ]
                      negated: T
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (C {<edie>} 
              {(DQ <'ERROR: enabling uprobe '> ($ Id.VSub_DollarName '$uname') <'. Exiting.'>)}
            )
          ]
          spids: [2356 2371]
        )
      ]
    )
    (C {<warn>} {(DQ <'echo > trace'>)})
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: (command.DParen child:<Id.Lit_ArithVarLike opt_duration>)
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (C {<sleep>} {($ Id.VSub_DollarName '$duration')})
            (command.If
              arms: [
                (if_arm
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: (command.DParen child:<Id.Lit_ArithVarLike opt_headers>)
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  action: [(C {<cat>} {<trace>})]
                  spids: [2412 2422]
                )
              ]
              else_action: [(C {<grep>} {<-v>} {(SQ <'^#'>)} {<trace>})]
            )
          ]
          spids: [2394 2404]
        )
      ]
      else_action: [
        (command.AndOr
          ops: [Id.Op_DAmp]
          children: [(command.DParen child:<Id.Lit_ArithVarLike opt_headers>) (C {<cat>} {<trace>})]
        )
        (C {<cat>} {<trace_pipe>})
      ]
    )
    (C {<end>})
  ]
)