(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_Other ':'> </usr/bin> <Id.Lit_Other ':'> </sbin>}
          spids: [253]
        )
      ]
    )
    (C {<trap>} {(SQ <':'>)} {<INT>} {<QUIT>} {<TERM>} {<PIPE>} {<HUP>})
    (command.ShFunction
      name: usage
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir
                  op: <Id.Redir_DLessDash '<<-'>
                  loc: (redir_loc.Fd fd:0)
                  arg: 
                    (redir_param.MultiLine
                      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>})
              ]
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit>)
          ]
        )
    )
    (command.ShFunction
      name: warn
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (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>})]
                    )
                  ]
                  spids: [354 365]
                )
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: end
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<echo>}]
              redirects: [(redir op:<Id.Redir_Great '2>'> loc:(redir_loc.Fd fd:2) arg:{</dev/null>})]
            )
            (command.Simple
              words: [{<echo>} {(DQ <'Ending tracing...'>)}]
              redirects: [(redir op:<Id.Redir_Great '2>'> loc:(redir_loc.Fd fd:2) arg:{</dev/null>})]
            )
            (C {<cd>} {($ Id.VSub_DollarName '$tracing')})
            (C {<warn>} {(DQ <'echo 0 > events/uprobes/'> ($ Id.VSub_DollarName '$uname') </enable>)})
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DParen
                          child: (arith_expr.VarRef token:<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: (arith_expr.VarRef token:<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: (arith_expr.VarRef token:<Id.Lit_ArithVarLike wroteflock>)
                )
                (C {<warn>} {(DQ <'rm '> ($ Id.VSub_DollarName '$flock'))})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: die
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<echo>} {(DQ ($ Id.VSub_At '$@'))}]
              redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
        )
    )
    (command.ShFunction
      name: edie
      body: 
        (command.BraceGroup
          children: [
            (command.Simple
              words: [{<echo>} {(DQ ($ Id.VSub_At '$@'))}]
              redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
            )
            (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>})
              ]
            )
            (C {<end>})
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
        )
    )
    (command.ShFunction
      name: set_path
      body: 
        (command.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 '$('>
                        command_list: 
                          (command.CommandList
                            children: [(C {<which>} {($ Id.VSub_DollarName '$name')})]
                          )
                      )
                    }
                  spids: [579]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (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 '$('>
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (command.Pipeline
                                        children: [
                                          (command.Simple
                                            words: [{<ldconfig>} {<-v>}]
                                            redirects: [
                                              (redir
                                                op: <Id.Redir_Great '2>'>
                                                loc: (redir_loc.Fd fd:2)
                                                arg: {</dev/null>}
                                              )
                                            ]
                                          )
                                          (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: [
                            (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: [
                    (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: 
        (command.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 '$('>
                        command_list: 
                          (command.CommandList
                            children: [
                              (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: 
                        (arith_expr.ArithWord
                          w: 
                            {<Id.Lit_Digits 0> <Id.Lit_ArithVarLike x> ($ Id.VSub_DollarName '$addr')}
                        )
                      right: (arith_expr.ArithWord w:{<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 '$('>
                        command_list: 
                          (command.CommandList
                            children: [
                              (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 '$('>
                        command_list: 
                          (command.CommandList
                            children: [(C {<file>} {($ Id.VSub_DollarName '$path')})]
                          )
                      )
                    }
                  spids: [883]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (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 '$('>
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (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: (arith_expr.VarRef token:<Id.Lit_ArithVarLike addr>)
                                    right: (arith_expr.VarRef token:<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: (arith_expr.VarRef token:<Id.Lit_ArithVarLike addr>)
                              right: (arith_expr.ArithWord w:{<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 '$('>
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (C {<printf>} {(DQ <'%x'>)} {($ Id.VSub_DollarName '$addr')})
                                    ]
                                  )
                              )
                            }
                          spids: [1009]
                        )
                      ]
                    )
                  ]
                  spids: [891 910]
                )
              ]
            )
          ]
        )
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: [
        (C {<getopts>} 
          {<Fd> <Id.Lit_Other ':'> <hHl> <Id.Lit_Other ':'> <p> <Id.Lit_Other ':'> <L> <Id.Lit_Other ':'> 
            <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: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$OPTIND')})
              right: (arith_expr.ArithWord w:{<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: [
            (command.Sentence
              child: (command.DParen child:(arith_expr.ArithWord w:{($ 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: [
            (command.Sentence
              child: (command.DParen child:(arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_list>))
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (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 '$('>
                command_list: (command.CommandList children:[(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 op_id:Id.VOp1_DPercent arg_word:{<'.*'>})
              )
            }
          spids: [1317]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: 
                    (arith_expr.Binary
                      op_id: Id.Arith_DAmp
                      left: 
                        (arith_expr.Binary
                          op_id: Id.Arith_DEqual
                          left: (arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_force>)
                          right: (arith_expr.ArithWord w:{<Id.Lit_Digits 0>})
                        )
                      right: 
                        (arith_expr.Binary
                          op_id: Id.Arith_Less
                          left: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$maj')})
                          right: (arith_expr.ArithWord w:{<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.MultiLine
                      here_begin: {<END>}
                      here_end_span_id: 1366
                      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>})
              ]
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit>)
          ]
          spids: [1324 1346]
        )
      ]
    )
    (command.ForEach
      iter_name: cmd
      iter_words: [{<file>} {<objdump>} {<ldconfig>} {<awk>}]
      do_arg_iter: F
      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>})]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (command.DParen
                  child: 
                    (arith_expr.Binary
                      op_id: Id.Arith_NEqual
                      left: (arith_expr.ArithWord w:{($ Id.VSub_QMark '$?')})
                      right: (arith_expr.ArithWord w:{<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: (arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_pid>)
                      right: (arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_filter>)
                    )
                  right: (arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_tid>)
                )
              right: (arith_expr.ArithWord w:{<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: (arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_duration>)
              right: (arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_view>)
            )
        )
        (C {<die>} {(DQ <'ERROR: use either -d or -v.'>)})
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (command.DParen child:(arith_expr.VarRef token:<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: [1522]
                )
              ]
            )
            (command.ForEach
              iter_name: tid
              iter_words: [{</proc/> ($ Id.VSub_DollarName '$pid') </task/> <Id.Lit_Star '*'>}]
              do_arg_iter: F
              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
                                      op_id: Id.VOp1_DPound
                                      arg_word: {<'*'> <Id.Lit_Slash />}
                                    )
                                )
                              )
                            }
                          spids: [1545]
                        )
                      ]
                    )
                  ]
                )
            )
            (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:(arith_expr.ArithWord w:{<Id.Lit_Digits 3>}))
                      )
                    }
                  spids: [1561]
                )
              ]
            )
          ]
          spids: [1505 1515]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (command.DParen child:(arith_expr.VarRef token:<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: [1586]
                )
              ]
            )
            (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: [1590]
                )
              ]
            )
          ]
          spids: [1573 1583]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (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_Other ':'> <Id.Lit_Other '*'>}
                        )
                      right: 
                        (bool_expr.Binary
                          op_id: Id.BoolBinary_GlobNEqual
                          left: {(DQ ($ Id.VSub_DollarName '$uprobe'))}
                          right: {<r> <Id.Lit_Other ':'> <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>})]
            )
            (C {<usage>})
          ]
          spids: [1598 1627]
        )
      ]
    )
    (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 op_id:Id.VOp1_DPercent arg_word:{<':*'>})
              )
            }
          spids: [1695]
        )
      ]
    )
    (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 op_id:Id.VOp1_Pound arg_word:{<'*:'>})
                ) <' '>
              )
            }
          spids: [1702]
        )
      ]
    )
    (C {<Id.KW_Set set>} {<-->} {($ Id.VSub_DollarName '$urest')})
    (command.If
      arms: [
        (if_arm
          cond: [
            (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_Other ':'> <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: [1736]
                    )
                  ]
                )
              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: [1739]
                    )
                  ]
                )
              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: [1746]
                )
              ]
            )
          ]
          spids: [1718 1733]
        )
      ]
      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_Other ':'> <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: [1775]
                )
              ]
            )
          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: [1779]
                )
              ]
            )
          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: [1788]
            )
          ]
        )
      ]
    )
    (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: [1795]
                )
              ]
            )
          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 op_id:Id.VOp1_DPercent arg_word:{<':*'>})
                  )
                }
              spids: [1799]
            )
          ]
        )
      ]
    )
    (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: [1806]
                )
              ]
            )
          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 op_id:Id.VOp1_DPound arg_word:{<'*:'>})
                  )
                }
              spids: [1810]
            )
          ]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (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
                            op_id: Id.VOp1_DPound
                            arg_word: {<'*'> <Id.Lit_Slash />}
                          )
                      )
                    }
                  spids: [1839]
                )
              ]
            )
            (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 op_id:Id.VOp1_DPercent arg_word:{<'.*'>})
                      )
                    }
                  spids: [1848]
                )
              ]
            )
          ]
          spids: [1821 1836]
        )
      ]
      else_action: [
        (command.ShAssignment
          pairs: [
            (assign_pair
              lhs: (sh_lhs_expr.Name name:seg)
              op: assign_op.Equal
              rhs: {($ Id.VSub_DollarName '$path')}
              spids: [1858]
            )
          ]
        )
        (C {<set_path>} {($ Id.VSub_DollarName '$path')})
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (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.VSub_DollarName '$addr')}
                      spids: [1914]
                    )
                  ]
                )
              ]
            )
          ]
          spids: [1876 1892]
        )
      ]
      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: [1939]
                )
              ]
            )
          ]
        )
        (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: [1957]
        )
      ]
    )
    (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: [1983]
            )
          ]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (command.DParen child:(arith_expr.VarRef token:<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: [1991 2001]
        )
      ]
    )
    (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: [
            (command.Sentence
              child: 
                (command.DParen
                  child: 
                    (arith_expr.Unary
                      op_id: Id.Arith_Bang
                      child: (arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_view>)
                    )
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DParen
                          child: (arith_expr.VarRef token:<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: [2051 2061]
                )
              ]
              else_action: [
                (C {<echo>} 
                  {
                    (DQ <'Tracing uprobe '> ($ Id.VSub_DollarName '$uname') <' ('> 
                      ($ Id.VSub_DollarName '$uprobe') <'). Ctrl-C to end.'>
                    )
                  }
                )
              ]
            )
          ]
          spids: [2037 2048]
        )
      ]
    )
    (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 '$('>
                command_list: 
                  (command.CommandList
                    children: [(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')}
            )
          ]
        )
        (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: [2138]
        )
      ]
    )
    (command.Simple
      words: [{<echo>} {<nop>}]
      redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<current_tracer>})]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (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>}
                        )
                      ]
                    )
                  ]
                  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>})]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DParen
                          child: (arith_expr.VarRef token:<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>})]
                    )
                    (command.Pipeline
                      children: [
                        (C {<dmesg>})
                        (C {<tail>} {<-> ($ Id.VSub_DollarName '$dmesg')})
                        (C {<sed>} {(SQ <'s/^/    /'>)})
                      ]
                      negated: F
                    )
                  ]
                  spids: [2185 2195]
                )
              ]
            )
            (C {<edie>} {(DQ <Exiting.>)})
          ]
          spids: [2153 2168]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (command.DParen child:(arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_view>))
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (C {<cat>} {<events/uprobes/> ($ Id.VSub_DollarName '$uname') </format>})
            (C {<edie>} {(DQ )})
          ]
          spids: [2239 2249]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (command.DParen child:(arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_filter>))
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (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>}
                                )
                              ]
                            )
                          ]
                          negated: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  action: [(C {<edie>} {(DQ <'ERROR: setting filter or -p. Exiting.'>)})]
                  spids: [2279 2296]
                )
              ]
            )
          ]
          spids: [2266 2276]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (command.DParen child:(arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_stack>))
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (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>}
                                )
                              ]
                            )
                          ]
                          negated: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  action: [(C {<edie>} {(DQ <'ERROR: enabling stack traces (-s). Exiting'>)})]
                  spids: [2323 2336]
                )
              ]
            )
          ]
          spids: [2310 2320]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (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>}
                        )
                      ]
                    )
                  ]
                  negated: T
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (C {<edie>} 
              {(DQ <'ERROR: enabling uprobe '> ($ Id.VSub_DollarName '$uname') <'. Exiting.'>)}
            )
          ]
          spids: [2350 2365]
        )
      ]
    )
    (C {<warn>} {(DQ <'echo > trace'>)})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: (arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_duration>)
                )
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (C {<sleep>} {($ Id.VSub_DollarName '$duration')})
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DParen
                          child: (arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_headers>)
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  action: [(C {<cat>} {<trace>})]
                  spids: [2406 2416]
                )
              ]
              else_action: [(C {<grep>} {<-v>} {(SQ <'^#'>)} {<trace>})]
            )
          ]
          spids: [2388 2398]
        )
      ]
      else_action: [
        (command.AndOr
          ops: [Id.Op_DAmp]
          children: [
            (command.DParen
              child: (arith_expr.VarRef token:<Id.Lit_ArithVarLike opt_headers>)
            )
            (C {<cat>} {<trace>})
          ]
        )
        (C {<cat>} {<trace_pipe>})
      ]
    )
    (C {<end>})
  ]
)