(command.CommandList
  children: [
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:tracing spids:[187])
          op: Equal
          rhs: {(/sys/kernel/debug/tracing)}
          spids: [187]
        )
      ]
      spids: [187]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:flock spids:[190])
                  op: Equal
                  rhs: {(/var/tmp/.ftrace-lock)}
                  spids: [190]
                )
              ]
              spids: [190]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (lhs_expr.LhsName name:wroteflock spids:[194])
              op: Equal
              rhs: {(0)}
              spids: [194]
            )
          ]
          spids: [194]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_duration spids:[197])
                  op: Equal
                  rhs: {(0)}
                  spids: [197]
                )
              ]
              spids: [197]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:duration spids:[201])
                  op: Equal
                  rhs: (word.EmptyWord)
                  spids: [201]
                )
              ]
              spids: [201]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_pid spids:[204])
                  op: Equal
                  rhs: {(0)}
                  spids: [204]
                )
              ]
              spids: [204]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:pid spids:[208])
                  op: Equal
                  rhs: (word.EmptyWord)
                  spids: [208]
                )
              ]
              spids: [208]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_tid spids:[211])
                  op: Equal
                  rhs: {(0)}
                  spids: [211]
                )
              ]
              spids: [211]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (lhs_expr.LhsName name:tid spids:[215])
              op: Equal
              rhs: (word.EmptyWord)
              spids: [215]
            )
          ]
          spids: [215]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_filter spids:[217])
                  op: Equal
                  rhs: {(0)}
                  spids: [217]
                )
              ]
              spids: [217]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:filter spids:[221])
                  op: Equal
                  rhs: (word.EmptyWord)
                  spids: [221]
                )
              ]
              spids: [221]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_view spids:[224])
                  op: Equal
                  rhs: {(0)}
                  spids: [224]
                )
              ]
              spids: [224]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_headers spids:[228])
                  op: Equal
                  rhs: {(0)}
                  spids: [228]
                )
              ]
              spids: [228]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_stack spids:[232])
                  op: Equal
                  rhs: {(0)}
                  spids: [232]
                )
              ]
              spids: [232]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (lhs_expr.LhsName name:dmesg spids:[236])
              op: Equal
              rhs: {(2)}
              spids: [236]
            )
          ]
          spids: [236]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:debug spids:[239])
                  op: Equal
                  rhs: {(0)}
                  spids: [239]
                )
              ]
              spids: [239]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_force spids:[243])
                  op: Equal
                  rhs: {(0)}
                  spids: [243]
                )
              ]
              spids: [243]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_list spids:[247])
                  op: Equal
                  rhs: {(0)}
                  spids: [247]
                )
              ]
              spids: [247]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (lhs_expr.LhsName name:target spids:[251])
              op: Equal
              rhs: (word.EmptyWord)
              spids: [251]
            )
          ]
          spids: [251]
        )
      ]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:PATH spids:[253])
          op: Equal
          rhs: {($ VSub_DollarName '$PATH') (Lit_Other ':') (/usr/bin) (Lit_Other ':') (/sbin)}
          spids: [253]
        )
      ]
      spids: [253]
    )
    (C {(trap)} {(SQ <':'>)} {(INT)} {(QUIT)} {(TERM)} {(PIPE)} {(HUP)})
    (command.FuncDef
      name: usage
      body: 
        (command.BraceGroup
          children: [
            (command.SimpleCommand
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: <Redir_DLessDash '<<-'>
                  fd: 16777215
                  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 ')
                    (Right_DoubleQuote '"')
                    (bash)
                    (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.EscapedLiteralPart token:<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.EscapedLiteralPart token:<Lit_EscapedChar '\\$'>)
                    ("retval' 'file == 0'\n")
                    ('\n')
                    ('See the man page and example file for more info.\n')
                  ]
                )
                (redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})
              ]
            )
            (command.ControlFlow token:<ControlFlow_Exit exit>)
          ]
          spids: [287]
        )
      spids: [283 286]
    )
    (command.FuncDef
      name: warn
      body: 
        (command.BraceGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.Pipeline
                          children: [(C {(eval)} {(DQ ($ VSub_At '$@'))})]
                          negated: T
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (command.SimpleCommand
                      words: [
                        {(echo)}
                        {
                          (DQ ('WARNING: command failed ') 
                            (word_part.EscapedLiteralPart
                              token: <Lit_EscapedChar '\\"'>
                            ) ($ VSub_At '$@') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>)
                          )
                        }
                      ]
                      redirects: [(redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})]
                    )
                  ]
                  spids: [16777215 365]
                )
              ]
              spids: [16777215 381]
            )
          ]
          spids: [351]
        )
      spids: [347 350]
    )
    (command.FuncDef
      name: end
      body: 
        (command.BraceGroup
          children: [
            (command.SimpleCommand
              words: [{(echo)}]
              redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})]
            )
            (command.SimpleCommand
              words: [{(echo)} {(DQ ('Ending tracing...'))}]
              redirects: [(redir.Redir op:<Redir_Great '2>'> fd:2 arg_word:{(/dev/null)})]
            )
            (C {(cd)} {($ VSub_DollarName '$tracing')})
            (C {(warn)} {(DQ ('echo 0 > events/uprobes/') ($ VSub_DollarName '$uname') (/enable))})
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DParen
                          child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_filter>)
                          spids: [429 434]
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(warn)} 
                      {(DQ ('echo 0 > events/uprobes/') ($ VSub_DollarName '$uname') (/filter))}
                    )
                  ]
                  spids: [16777215 437]
                )
              ]
              spids: [16777215 449]
            )
            (C {(warn)} {(DQ ('echo -:') ($ VSub_DollarName '$uname') (' >> uprobe_events'))})
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (command.DParen
                  child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_stack>)
                  spids: [461 466]
                )
                (C {(warn)} {(DQ ('echo 0 > options/userstacktrace'))})
              ]
            )
            (C {(warn)} {(DQ ('echo > trace'))})
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (command.DParen
                  child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike wroteflock>)
                  spids: [484 489]
                )
                (C {(warn)} {(DQ ('rm ') ($ VSub_DollarName '$flock'))})
              ]
            )
          ]
          spids: [390]
        )
      spids: [386 389]
    )
    (command.FuncDef
      name: die
      body: 
        (command.BraceGroup
          children: [
            (command.SimpleCommand
              words: [{(echo)} {(DQ ($ VSub_At '$@'))}]
              redirects: [(redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})]
            )
            (command.ControlFlow token:<ControlFlow_Exit exit> arg_word:{(1)})
          ]
          spids: [507]
        )
      spids: [503 506]
    )
    (command.FuncDef
      name: edie
      body: 
        (command.BraceGroup
          children: [
            (command.SimpleCommand
              words: [{(echo)} {(DQ ($ VSub_At '$@'))}]
              redirects: [(redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})]
            )
            (command.SimpleCommand
              words: [{(exec)}]
              redirects: [
                (redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(/dev/null)})
                (redir.Redir op:<Redir_GreatAnd '2>&'> fd:2 arg_word:{(1)})
              ]
            )
            (C {(end)})
            (command.ControlFlow token:<ControlFlow_Exit exit> arg_word:{(1)})
          ]
          spids: [531]
        )
      spids: [527 530]
    )
    (command.FuncDef
      name: set_path
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:name spids:[574])
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [574]
                )
              ]
              spids: [574]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:path spids:[579])
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [(C {(which)} {($ VSub_DollarName '$name')})]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [580 584]
                      )
                    }
                  spids: [579]
                )
              ]
              spids: [579]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {(DQ ($ VSub_DollarName '$path'))}
                              right: {(DQ )}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:path spids:[606])
                          op: Equal
                          rhs: 
                            {
                              (word_part.CommandSubPart
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (command.Pipeline
                                        children: [
                                          (command.SimpleCommand
                                            words: [{(ldconfig)} {(-v)}]
                                            redirects: [
                                              (redir.Redir
                                                op: <Redir_Great '2>'>
                                                fd: 2
                                                arg_word: {(/dev/null)}
                                              )
                                            ]
                                          )
                                          (C {(awk)} {(-v)} 
                                            {(Lit_VarLike 'lib=') ($ 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
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [607 630]
                              )
                            }
                          spids: [606]
                        )
                      ]
                      spids: [606]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (command.DBracket
                                  expr: 
                                    (bool_expr.BoolBinary
                                      op_id: BoolBinary_GlobDEqual
                                      left: {(DQ ($ VSub_DollarName '$path'))}
                                      right: {(DQ )}
                                    )
                                )
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [
                            (C {(die)} 
                              {
                                (DQ ('ERROR: segment ') 
                                  (word_part.EscapedLiteralPart
                                    token: <Lit_EscapedChar '\\"'>
                                  ) ($ VSub_DollarName '$name') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) 
                                  (' ambiguous.')
                                )
                              } {(DQ ('Program or library? Try a full path.'))}
                            )
                          ]
                          spids: [16777215 649]
                        )
                      ]
                      spids: [16777215 669]
                    )
                  ]
                  spids: [16777215 603]
                )
              ]
              spids: [16777215 672]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.LogicalNot
                              child: 
                                (bool_expr.BoolUnary
                                  op_id: BoolUnary_x
                                  child: {($ VSub_DollarName '$path')}
                                )
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(die)} 
                      {
                        (DQ ('ERROR: resolved ') 
                          (word_part.EscapedLiteralPart
                            token: <Lit_EscapedChar '\\"'>
                          ) ($ VSub_DollarName '$name') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) (' to ') 
                          (word_part.EscapedLiteralPart
                            token: <Lit_EscapedChar '\\"'>
                          ) ($ VSub_DollarName '$path') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) 
                          (', but file missing')
                        )
                      }
                    )
                  ]
                  spids: [16777215 689]
                )
              ]
              spids: [16777215 707]
            )
          ]
          spids: [571]
        )
      spids: [567 570]
    )
    (command.FuncDef
      name: set_addr
      body: 
        (command.BraceGroup
          children: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:path spids:[719])
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [719]
                )
              ]
              spids: [719]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:name spids:[723])
                  op: Equal
                  rhs: {($ VSub_Number '$2')}
                  spids: [723]
                )
              ]
              spids: [723]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:sym spids:[727])
                  op: Equal
                  rhs: {($ VSub_Number '$3')}
                  spids: [727]
                )
              ]
              spids: [727]
            )
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_GlobDEqual
                      left: {(DQ ($ VSub_DollarName '$path'))}
                      right: {(DQ )}
                    )
                )
                (C {(die)} {(DQ ('ERROR: missing symbol path.'))})
              ]
            )
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_GlobDEqual
                      left: {(DQ ($ VSub_DollarName '$sym'))}
                      right: {(DQ )}
                    )
                )
                (C {(die)} {(DQ ('ERROR: missing symbol for ') ($ VSub_DollarName '$path'))})
              ]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:addr spids:[778])
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [
                              (command.Pipeline
                                children: [
                                  (C {(objdump)} {(-tT)} {($ VSub_DollarName '$path')})
                                  (C {(awk)} {(-v)} {(Lit_VarLike 'sym=') ($ VSub_DollarName '$sym')} 
                                    {
                                      (SQ <'\n'> 
                                        <'\t    $NF == sym && $4 == ".text"  { print $1; exit }'>
                                      )
                                    }
                                  )
                                ]
                                negated: F
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [779 799]
                      )
                    }
                  spids: [778]
                )
              ]
              spids: [778]
            )
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_GlobDEqual
                      left: {(DQ ($ VSub_DollarName '$addr'))}
                      right: {(DQ )}
                    )
                )
                (C {(die)} 
                  {
                    (DQ ('ERROR: missing symbol ') 
                      (word_part.EscapedLiteralPart
                        token: <Lit_EscapedChar '\\"'>
                      ) ($ VSub_DollarName '$sym') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) (' in ') 
                      ($ VSub_DollarName '$path')
                    )
                  }
                )
              ]
            )
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (command.DParen
                  child: 
                    (arith_expr.ArithBinary
                      op_id: Arith_DEqual
                      left: 
                        (arith_expr.ArithWord
                          w: {(Lit_Digits 0) (Lit_ArithVarLike x) ($ VSub_DollarName '$addr')}
                        )
                      right: (arith_expr.ArithWord w:{(Lit_Digits 0)})
                    )
                  spids: [829 840]
                )
                (C {(die)} 
                  {
                    (DQ ('ERROR: failed resolving ') 
                      (word_part.EscapedLiteralPart
                        token: <Lit_EscapedChar '\\"'>
                      ) ($ VSub_DollarName '$sym') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) (' in ') 
                      ($ VSub_DollarName '$path') (.)
                    )
                  } {(DQ ('Maybe it exists in a different target (eg, library)?'))}
                )
              ]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:addr spids:[863])
                  op: Equal
                  rhs: 
                    {(0x) 
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [(C {(printf)} {(DQ ('%x'))} {(0x) ($ VSub_DollarName '$addr')})]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [865 876]
                      )
                    }
                  spids: [863]
                )
              ]
              spids: [863]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:type spids:[883])
                  op: Equal
                  rhs: 
                    {
                      (word_part.CommandSubPart
                        command_list: 
                          (command.CommandList
                            children: [(C {(file)} {($ VSub_DollarName '$path')})]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [884 888]
                      )
                    }
                  spids: [883]
                )
              ]
              spids: [883]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolBinary
                              op_id: BoolBinary_GlobNEqual
                              left: {(DQ ($ VSub_DollarName '$type'))}
                              right: 
                                {(Lit_Other '*') (shared) (Lit_Other '?') (object) (Lit_Other '*')}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:base spids:[921])
                          op: Equal
                          rhs: 
                            {
                              (word_part.CommandSubPart
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (command.Pipeline
                                        children: [
                                          (C {(objdump)} {(-x)} {($ VSub_DollarName '$path')})
                                          (C {(awk)} 
                                            {
                                              (SQ <'\n'> 
                                                <
'\t\t    $1 == "LOAD" && $3 ~ /^[0x]*$/ { print $5 }'
                                                >
                                              )
                                            }
                                          )
                                        ]
                                        negated: F
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [922 937]
                              )
                            }
                          spids: [921]
                        )
                      ]
                      spids: [921]
                    )
                    (command.AndOr
                      ops: [Op_DAmp]
                      children: [
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolBinary
                              op_id: BoolBinary_GlobNEqual
                              left: {(DQ ($ VSub_DollarName '$base'))}
                              right: {(0x) (Lit_Other '*')}
                            )
                        )
                        (C {(die)} {(DQ ('ERROR: finding base load addr'))} 
                          {(DQ ('for ') ($ VSub_DollarName '$path') (.))}
                        )
                      ]
                    )
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:addr spids:[969])
                          op: Equal
                          rhs: 
                            {
                              (word_part.ArithSubPart
                                anode: 
                                  (arith_expr.ArithBinary
                                    op_id: Arith_Minus
                                    left: (arith_expr.ArithVarRef token:<Lit_ArithVarLike addr>)
                                    right: (arith_expr.ArithVarRef token:<Lit_ArithVarLike base>)
                                  )
                                spids: [970 979]
                              )
                            }
                          spids: [969]
                        )
                      ]
                      spids: [969]
                    )
                    (command.AndOr
                      ops: [Op_DAmp]
                      children: [
                        (command.DParen
                          child: 
                            (arith_expr.ArithBinary
                              op_id: Arith_Less
                              left: (arith_expr.ArithVarRef token:<Lit_ArithVarLike addr>)
                              right: (arith_expr.ArithWord w:{(Lit_Digits 0)})
                            )
                          spids: [982 991]
                        )
                        (C {(die)} {(DQ ('ERROR: transposed address for ') ($ VSub_DollarName '$sym'))} 
                          {(DQ ('became negative: ') ($ VSub_DollarName '$addr'))}
                        )
                      ]
                    )
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:addr spids:[1009])
                          op: Equal
                          rhs: 
                            {(0x) 
                              (word_part.CommandSubPart
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (C {(printf)} {(DQ ('%x'))} {($ VSub_DollarName '$addr')})
                                    ]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [1011 1020]
                              )
                            }
                          spids: [1009]
                        )
                      ]
                      spids: [1009]
                    )
                  ]
                  spids: [16777215 910]
                )
              ]
              spids: [16777215 1023]
            )
          ]
          spids: [716]
        )
      spids: [712 715]
    )
    (command.WhileUntil
      keyword: <KW_While while>
      cond: [
        (C {(getopts)} 
          {(Fd) (Lit_Other ':') (hHl) (Lit_Other ':') (p) (Lit_Other ':') (L) (Lit_Other ':') (sv)} {(opt)}
        )
      ]
      body: 
        (command.DoGroup
          children: [
            (command.Case
              to_match: {($ VSub_DollarName '$opt')}
              arms: [
                (case_arm
                  pat_list: [{(F)}]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:opt_force spids:[1060])
                          op: Equal
                          rhs: {(1)}
                          spids: [1060]
                        )
                      ]
                      spids: [1060]
                    )
                  ]
                  spids: [1057 1058 1063 16777215]
                )
                (case_arm
                  pat_list: [{(d)}]
                  action: [
                    (command.Sentence
                      child: 
                        (command.Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (lhs_expr.LhsName name:opt_duration spids:[1069])
                              op: Equal
                              rhs: {(1)}
                              spids: [1069]
                            )
                          ]
                          spids: [1069]
                        )
                      terminator: <Op_Semi ';'>
                    )
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:duration spids:[1073])
                          op: Equal
                          rhs: {($ VSub_DollarName '$OPTARG')}
                          spids: [1073]
                        )
                      ]
                      spids: [1073]
                    )
                  ]
                  spids: [1066 1067 1076 16777215]
                )
                (case_arm
                  pat_list: [{(p)}]
                  action: [
                    (command.Sentence
                      child: 
                        (command.Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (lhs_expr.LhsName name:opt_pid spids:[1082])
                              op: Equal
                              rhs: {(1)}
                              spids: [1082]
                            )
                          ]
                          spids: [1082]
                        )
                      terminator: <Op_Semi ';'>
                    )
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:pid spids:[1086])
                          op: Equal
                          rhs: {($ VSub_DollarName '$OPTARG')}
                          spids: [1086]
                        )
                      ]
                      spids: [1086]
                    )
                  ]
                  spids: [1079 1080 1089 16777215]
                )
                (case_arm
                  pat_list: [{(L)}]
                  action: [
                    (command.Sentence
                      child: 
                        (command.Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (lhs_expr.LhsName name:opt_tid spids:[1095])
                              op: Equal
                              rhs: {(1)}
                              spids: [1095]
                            )
                          ]
                          spids: [1095]
                        )
                      terminator: <Op_Semi ';'>
                    )
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:tid spids:[1099])
                          op: Equal
                          rhs: {($ VSub_DollarName '$OPTARG')}
                          spids: [1099]
                        )
                      ]
                      spids: [1099]
                    )
                  ]
                  spids: [1092 1093 1102 16777215]
                )
                (case_arm
                  pat_list: [{(l)}]
                  action: [
                    (command.Sentence
                      child: 
                        (command.Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (lhs_expr.LhsName name:opt_list spids:[1108])
                              op: Equal
                              rhs: {(1)}
                              spids: [1108]
                            )
                          ]
                          spids: [1108]
                        )
                      terminator: <Op_Semi ';'>
                    )
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:target spids:[1112])
                          op: Equal
                          rhs: {($ VSub_DollarName '$OPTARG')}
                          spids: [1112]
                        )
                      ]
                      spids: [1112]
                    )
                  ]
                  spids: [1105 1106 1115 16777215]
                )
                (case_arm
                  pat_list: [{(H)}]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:opt_headers spids:[1121])
                          op: Equal
                          rhs: {(1)}
                          spids: [1121]
                        )
                      ]
                      spids: [1121]
                    )
                  ]
                  spids: [1118 1119 1124 16777215]
                )
                (case_arm
                  pat_list: [{(s)}]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:opt_stack spids:[1130])
                          op: Equal
                          rhs: {(1)}
                          spids: [1130]
                        )
                      ]
                      spids: [1130]
                    )
                  ]
                  spids: [1127 1128 1133 16777215]
                )
                (case_arm
                  pat_list: [{(v)}]
                  action: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:opt_view spids:[1139])
                          op: Equal
                          rhs: {(1)}
                          spids: [1139]
                        )
                      ]
                      spids: [1139]
                    )
                  ]
                  spids: [1136 1137 1142 16777215]
                )
                (case_arm
                  pat_list: [{(h)} {(Lit_Other '?')}]
                  action: [(C {(usage)})]
                  spids: [1145 1148 1152 16777215]
                )
              ]
              spids: [1050 1054 1155]
            )
          ]
          spids: [1047 1157]
        )
    )
    (C {(shift)} 
      {
        (word_part.ArithSubPart
          anode: 
            (arith_expr.ArithBinary
              op_id: Arith_Minus
              left: (arith_expr.ArithWord w:{($ VSub_DollarName '$OPTIND')})
              right: (arith_expr.ArithWord w:{(Lit_Digits 1)})
            )
          spids: [1161 1170]
        )
      }
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:uprobe spids:[1172])
          op: Equal
          rhs: {($ VSub_Number '$1')}
          spids: [1172]
        )
      ]
      spids: [1172]
    )
    (C {(shift)})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: (arith_expr.ArithWord w:{($ VSub_Pound '$#')})
                  spids: [1179 1184]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_filter spids:[1190])
                  op: Equal
                  rhs: {(1)}
                  spids: [1190]
                )
              ]
              spids: [1190]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:filter spids:[1194])
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [1194]
                )
              ]
              spids: [1194]
            )
          ]
          spids: [16777215 1187]
        )
      ]
      spids: [16777215 1197]
    )
    (command.AndOr
      ops: [Op_DAmp]
      children: [
        (command.DBracket
          expr: 
            (bool_expr.LogicalAnd
              left: 
                (bool_expr.BoolBinary
                  op_id: BoolBinary_GlobDEqual
                  left: {(DQ ($ VSub_DollarName '$opt_list'))}
                  right: {(1)}
                )
              right: 
                (bool_expr.BoolBinary
                  op_id: BoolBinary_GlobNEqual
                  left: {(DQ ($ 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.ArithVarRef token:<Lit_ArithVarLike opt_list>)
                  spids: [1236 1241]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.BoolBinary
                              op_id: BoolBinary_GlobNEqual
                              left: {(DQ ($ VSub_DollarName '$target'))}
                              right: {(Lit_Other '*') (/) (Lit_Other '*')}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(set_path)} {($ VSub_DollarName '$target')})
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:target spids:[1272])
                          op: Equal
                          rhs: {($ VSub_DollarName '$path')}
                          spids: [1272]
                        )
                      ]
                      spids: [1272]
                    )
                  ]
                  spids: [16777215 1264]
                )
              ]
              spids: [16777215 1276]
            )
            (command.Pipeline
              children: [
                (C {(objdump)} {(-tT)} {($ VSub_DollarName '$target')})
                (C {(awk)} {(SQ <'$4 == ".text" { print $NF }'>)})
                (C {(sort)})
                (C {(uniq)})
              ]
              negated: F
            )
            (command.ControlFlow token:<ControlFlow_Exit exit>)
          ]
          spids: [16777215 1244]
        )
      ]
      spids: [16777215 1304]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:ver spids:[1310])
          op: Equal
          rhs: 
            {
              (word_part.CommandSubPart
                command_list: (command.CommandList children:[(C {(uname)} {(-r)})])
                left_token: <Left_CommandSub '$('>
                spids: [1311 1315]
              )
            }
          spids: [1310]
        )
      ]
      spids: [1310]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:maj spids:[1317])
          op: Equal
          rhs: 
            {
              (word_part.BracedVarSub
                token: <VSub_Name ver>
                suffix_op: (suffix_op.StringUnary op_id:VOp1_DPercent arg_word:{('.*')})
                spids: [1318 1322]
              )
            }
          spids: [1317]
        )
      ]
      spids: [1317]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: 
                    (arith_expr.ArithBinary
                      op_id: Arith_DAmp
                      left: 
                        (arith_expr.ArithBinary
                          op_id: Arith_DEqual
                          left: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_force>)
                          right: (arith_expr.ArithWord w:{(Lit_Digits 0)})
                        )
                      right: 
                        (arith_expr.ArithBinary
                          op_id: Arith_Less
                          left: (arith_expr.ArithWord w:{($ VSub_DollarName '$maj')})
                          right: (arith_expr.ArithWord w:{(Lit_Digits 4)})
                        )
                    )
                  spids: [1326 1343]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.SimpleCommand
              words: [{(cat)}]
              redirects: [
                (redir.HereDoc
                  op: <Redir_DLessDash '<<-'>
                  fd: 16777215
                  here_begin: {(END)}
                  here_end_span_id: 1366
                  stdin_parts: [
                    ('ERROR: Kernel version >= 4.0 preferred (you have ')
                    ($ 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.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})
              ]
            )
            (command.ControlFlow token:<ControlFlow_Exit exit>)
          ]
          spids: [16777215 1346]
        )
      ]
      spids: [16777215 1370]
    )
    (command.ForEach
      iter_name: cmd
      iter_words: [{(file)} {(objdump)} {(ldconfig)} {(awk)}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.SimpleCommand
              words: [{(which)} {($ VSub_DollarName '$cmd')}]
              redirects: [(redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(/dev/null)})]
            )
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (command.DParen
                  child: 
                    (arith_expr.ArithBinary
                      op_id: Arith_NEqual
                      left: (arith_expr.ArithWord w:{($ VSub_QMark '$?')})
                      right: (arith_expr.ArithWord w:{(Lit_Digits 0)})
                    )
                  spids: [1403 1412]
                )
                (C {(die)} 
                  {
                    (DQ ('ERROR: missing ') ($ VSub_DollarName '$cmd') (' in ') 
                      (word_part.EscapedLiteralPart
                        token: <Lit_EscapedChar '\\$'>
                      ) ('PATH. ') ($ VSub_Number '$0') (' needs')
                    )
                  } {(DQ ('to use this command. Exiting.'))}
                )
              ]
            )
          ]
          spids: [1391 1434]
        )
      spids: [1381 1389]
    )
    (command.AndOr
      ops: [Op_DAmp]
      children: [
        (command.DBracket
          expr: 
            (bool_expr.BoolBinary
              op_id: BoolBinary_GlobDEqual
              left: {(DQ ($ VSub_DollarName '$uprobe'))}
              right: {(DQ )}
            )
        )
        (C {(usage)})
      ]
    )
    (command.AndOr
      ops: [Op_DAmp]
      children: [
        (command.DParen
          child: 
            (arith_expr.ArithBinary
              op_id: Arith_Great
              left: 
                (arith_expr.ArithBinary
                  op_id: Arith_Plus
                  left: 
                    (arith_expr.ArithBinary
                      op_id: Arith_Plus
                      left: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_pid>)
                      right: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_filter>)
                    )
                  right: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_tid>)
                )
              right: (arith_expr.ArithWord w:{(Lit_Digits 1)})
            )
          spids: [1457 1474]
        )
        (C {(die)} {(DQ ('ERROR: use at most one of -p, -L, or filter.'))})
      ]
    )
    (command.AndOr
      ops: [Op_DAmp]
      children: [
        (command.DParen
          child: 
            (arith_expr.ArithBinary
              op_id: Arith_DAmp
              left: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_duration>)
              right: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_view>)
            )
          spids: [1486 1495]
        )
        (C {(die)} {(DQ ('ERROR: use either -d or -v.'))})
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_pid>)
                  spids: [1507 1512]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_filter spids:[1522])
                  op: Equal
                  rhs: {(1)}
                  spids: [1522]
                )
              ]
              spids: [1522]
            )
            (command.ForEach
              iter_name: tid
              iter_words: [{(/proc/) ($ VSub_DollarName '$pid') (/task/) (Lit_Other '*')}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (lhs_expr.LhsName name:filter spids:[1545])
                          op: Equal
                          rhs: 
                            {
                              (DQ ($ VSub_DollarName '$filter') (' || common_pid == ') 
                                (word_part.BracedVarSub
                                  token: <VSub_Name tid>
                                  suffix_op: 
                                    (suffix_op.StringUnary
                                      op_id: VOp1_DPound
                                      arg_word: {('*') (Lit_Slash /)}
                                    )
                                  spids: [1549 1554]
                                )
                              )
                            }
                          spids: [1545]
                        )
                      ]
                      spids: [1545]
                    )
                  ]
                  spids: [1542 1558]
                )
              spids: [1535 1540]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:filter spids:[1561])
                  op: Equal
                  rhs: 
                    {
                      (word_part.BracedVarSub
                        token: <VSub_Name filter>
                        suffix_op: (suffix_op.Slice begin:(arith_expr.ArithWord w:{(Lit_Digits 3)}))
                        spids: [1562 1566]
                      )
                    }
                  spids: [1561]
                )
              ]
              spids: [1561]
            )
          ]
          spids: [16777215 1515]
        )
      ]
      spids: [16777215 1571]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_tid>)
                  spids: [1575 1580]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:opt_filter spids:[1586])
                  op: Equal
                  rhs: {(1)}
                  spids: [1586]
                )
              ]
              spids: [1586]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:filter spids:[1590])
                  op: Equal
                  rhs: {(DQ ('common_pid == ') ($ VSub_DollarName '$tid'))}
                  spids: [1590]
                )
              ]
              spids: [1590]
            )
          ]
          spids: [16777215 1583]
        )
      ]
      spids: [16777215 1596]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DBracket
                  expr: 
                    (bool_expr.LogicalAnd
                      left: 
                        (bool_expr.BoolBinary
                          op_id: BoolBinary_GlobNEqual
                          left: {(DQ ($ VSub_DollarName '$uprobe'))}
                          right: {(p) (Lit_Other ':') (Lit_Other '*')}
                        )
                      right: 
                        (bool_expr.BoolBinary
                          op_id: BoolBinary_GlobNEqual
                          left: {(DQ ($ VSub_DollarName '$uprobe'))}
                          right: {(r) (Lit_Other ':') (Lit_Other '*')}
                        )
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.SimpleCommand
              words: [{(echo)} {(DQ ('ERROR: invalid uprobe definition (should start with p: or r:)'))}]
              redirects: [(redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})]
            )
            (C {(usage)})
          ]
          spids: [16777215 1627]
        )
      ]
      spids: [16777215 1642]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:utype spids:[1695])
          op: Equal
          rhs: 
            {
              (word_part.BracedVarSub
                token: <VSub_Name uprobe>
                suffix_op: (suffix_op.StringUnary op_id:VOp1_DPercent arg_word:{(':*')})
                spids: [1696 1700]
              )
            }
          spids: [1695]
        )
      ]
      spids: [1695]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:urest spids:[1702])
          op: Equal
          rhs: 
            {
              (DQ 
                (word_part.BracedVarSub
                  token: <VSub_Name uprobe>
                  suffix_op: (suffix_op.StringUnary op_id:VOp1_Pound arg_word:{('*:')})
                  spids: [1704 1708]
                ) (' ')
              )
            }
          spids: [1702]
        )
      ]
      spids: [1702]
    )
    (C {(set)} {(--)} {($ VSub_DollarName '$urest')})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_GlobDEqual
                      left: {($ VSub_Number '$1')}
                      right: {(Lit_Other '*') (Lit_Other ':') (Lit_Other '*')}
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:uname spids:[1736])
                      op: Equal
                      rhs: (word.EmptyWord)
                      spids: [1736]
                    )
                  ]
                  spids: [1736]
                )
              terminator: <Op_Semi ';'>
            )
            (command.Sentence
              child: 
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:probe spids:[1739])
                      op: Equal
                      rhs: {($ VSub_Number '$1')}
                      spids: [1739]
                    )
                  ]
                  spids: [1739]
                )
              terminator: <Op_Semi ';'>
            )
            (command.Sentence child:(C {(shift)}) terminator:<Op_Semi ';'>)
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:uargs spids:[1746])
                  op: Equal
                  rhs: {(DQ ($ VSub_At '$@'))}
                  spids: [1746]
                )
              ]
              spids: [1746]
            )
          ]
          spids: [16777215 1733]
        )
      ]
      else_action: [
        (command.AndOr
          ops: [Op_DAmp]
          children: [
            (command.DBracket
              expr: 
                (bool_expr.BoolBinary
                  op_id: BoolBinary_GlobNEqual
                  left: {($ VSub_Number '$2')}
                  right: {(Lit_Other '*') (Lit_Other ':') (Lit_Other '*')}
                )
            )
            (C {(die)} {(DQ ('ERROR: invalid probe. See usage (-h).'))})
          ]
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:uname spids:[1775])
                  op: Equal
                  rhs: {($ VSub_Number '$1')}
                  spids: [1775]
                )
              ]
              spids: [1775]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:probe spids:[1779])
                  op: Equal
                  rhs: {($ VSub_Number '$2')}
                  spids: [1779]
                )
              ]
              spids: [1779]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Sentence child:(C {(shift)} {(2)}) terminator:<Op_Semi ';'>)
        (command.Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (lhs_expr.LhsName name:uargs spids:[1788])
              op: Equal
              rhs: {(DQ ($ VSub_At '$@'))}
              spids: [1788]
            )
          ]
          spids: [1788]
        )
      ]
      spids: [1751 1793]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:path spids:[1795])
                  op: Equal
                  rhs: {($ VSub_DollarName '$probe')}
                  spids: [1795]
                )
              ]
              spids: [1795]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (lhs_expr.LhsName name:path spids:[1799])
              op: Equal
              rhs: 
                {
                  (word_part.BracedVarSub
                    token: <VSub_Name path>
                    suffix_op: (suffix_op.StringUnary op_id:VOp1_DPercent arg_word:{(':*')})
                    spids: [1800 1804]
                  )
                }
              spids: [1799]
            )
          ]
          spids: [1799]
        )
      ]
    )
    (command.CommandList
      children: [
        (command.Sentence
          child: 
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:addr spids:[1806])
                  op: Equal
                  rhs: {($ VSub_DollarName '$probe')}
                  spids: [1806]
                )
              ]
              spids: [1806]
            )
          terminator: <Op_Semi ';'>
        )
        (command.Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (lhs_expr.LhsName name:addr spids:[1810])
              op: Equal
              rhs: 
                {
                  (word_part.BracedVarSub
                    token: <VSub_Name addr>
                    suffix_op: (suffix_op.StringUnary op_id:VOp1_DPound arg_word:{('*:')})
                    spids: [1811 1815]
                  )
                }
              spids: [1810]
            )
          ]
          spids: [1810]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_GlobDEqual
                      left: {($ VSub_DollarName '$path')}
                      right: {(Lit_Other '*') (/) (Lit_Other '*')}
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:seg spids:[1839])
                  op: Equal
                  rhs: 
                    {
                      (word_part.BracedVarSub
                        token: <VSub_Name path>
                        suffix_op: 
                          (suffix_op.StringUnary
                            op_id: VOp1_DPound
                            arg_word: {('*') (Lit_Slash /)}
                          )
                        spids: [1840 1845]
                      )
                    }
                  spids: [1839]
                )
              ]
              spids: [1839]
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:seg spids:[1848])
                  op: Equal
                  rhs: 
                    {
                      (word_part.BracedVarSub
                        token: <VSub_Name seg>
                        suffix_op: (suffix_op.StringUnary op_id:VOp1_DPercent arg_word:{('.*')})
                        spids: [1849 1853]
                      )
                    }
                  spids: [1848]
                )
              ]
              spids: [1848]
            )
          ]
          spids: [16777215 1836]
        )
      ]
      else_action: [
        (command.Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (lhs_expr.LhsName name:seg spids:[1858])
              op: Equal
              rhs: {($ VSub_DollarName '$path')}
              spids: [1858]
            )
          ]
          spids: [1858]
        )
        (C {(set_path)} {($ VSub_DollarName '$path')})
      ]
      spids: [1855 1870]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_GlobDEqual
                      left: {(DQ ($ VSub_DollarName '$addr'))}
                      right: {(0x) (Lit_Other '*')}
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.AndOr
              ops: [Op_DAmp]
              children: [
                (command.DBracket
                  expr: 
                    (bool_expr.BoolBinary
                      op_id: BoolBinary_GlobDEqual
                      left: {(DQ ($ VSub_DollarName '$uname'))}
                      right: {(DQ )}
                    )
                )
                (command.Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (lhs_expr.LhsName name:uname spids:[1914])
                      op: Equal
                      rhs: {(${ VSub_Name seg) (_) ($ VSub_DollarName '$addr')}
                      spids: [1914]
                    )
                  ]
                  spids: [1914]
                )
              ]
            )
          ]
          spids: [16777215 1892]
        )
      ]
      else_action: [
        (command.AndOr
          ops: [Op_DAmp]
          children: [
            (command.DBracket
              expr: 
                (bool_expr.BoolBinary
                  op_id: BoolBinary_GlobDEqual
                  left: {(DQ ($ VSub_DollarName '$uname'))}
                  right: {(DQ )}
                )
            )
            (command.Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (lhs_expr.LhsName name:uname spids:[1939])
                  op: Equal
                  rhs: {($ VSub_DollarName '$addr')}
                  spids: [1939]
                )
              ]
              spids: [1939]
            )
          ]
        )
        (C {(set_addr)} {($ VSub_DollarName '$path')} {($ VSub_DollarName '$seg')} 
          {($ VSub_DollarName '$addr')}
        )
      ]
      spids: [1921 1951]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:uprobe spids:[1957])
          op: Equal
          rhs: 
            {
              (DQ ($ VSub_DollarName '$utype') (':') ($ VSub_DollarName '$uname') (' ') 
                ($ VSub_DollarName '$path') (':') ($ VSub_DollarName '$addr')
              )
            }
          spids: [1957]
        )
      ]
      spids: [1957]
    )
    (command.AndOr
      ops: [Op_DAmp]
      children: [
        (command.DBracket
          expr: 
            (bool_expr.BoolBinary
              op_id: BoolBinary_GlobNEqual
              left: {(DQ ($ VSub_DollarName '$uargs'))}
              right: {(DQ )}
            )
        )
        (command.Assignment
          keyword: Assign_None
          pairs: [
            (assign_pair
              lhs: (lhs_expr.LhsName name:uprobe spids:[1983])
              op: Equal
              rhs: {(DQ ($ VSub_DollarName '$uprobe') (' ') ($ VSub_DollarName '$uargs'))}
              spids: [1983]
            )
          ]
          spids: [1983]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike debug>)
                  spids: [1993 1998]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (C {(echo)} 
              {
                (DQ ('uname: ') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) 
                  ($ VSub_DollarName '$uname') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) (', uprobe: ') 
                  (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) ($ VSub_DollarName '$uprobe') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>)
                )
              }
            )
          ]
          spids: [16777215 2001]
        )
      ]
      spids: [16777215 2017]
    )
    (command.AndOr
      ops: [Op_DPipe]
      children: [
        (C {(cd)} {($ 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.ArithUnary
                      op_id: Arith_Bang
                      child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_view>)
                    )
                  spids: [2039 2045]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DParen
                          child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_duration>)
                          spids: [2053 2058]
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(echo)} 
                      {
                        (DQ ('Tracing uprobe ') ($ VSub_DollarName '$uname') (' for ') 
                          ($ VSub_DollarName '$duration') (' seconds (buffered)...')
                        )
                      }
                    )
                  ]
                  spids: [16777215 2061]
                )
              ]
              else_action: [
                (C {(echo)} 
                  {
                    (DQ ('Tracing uprobe ') ($ VSub_DollarName '$uname') (' (') 
                      ($ VSub_DollarName '$uprobe') ('). Ctrl-C to end.')
                    )
                  }
                )
              ]
              spids: [2075 2089]
            )
          ]
          spids: [16777215 2048]
        )
      ]
      spids: [16777215 2091]
    )
    (command.AndOr
      ops: [Op_DAmp]
      children: [
        (command.DBracket
          expr: (bool_expr.BoolUnary op_id:BoolUnary_e child:{($ VSub_DollarName '$flock')})
        )
        (C {(die)} 
          {
            (DQ ('ERROR: ftrace may be in use by PID ') 
              (word_part.CommandSubPart
                command_list: 
                  (command.CommandList
                    children: [(C {(cat)} {($ VSub_DollarName '$flock')})]
                  )
                left_token: <Left_CommandSub '$('>
                spids: [2111 2115]
              ) (' ') ($ VSub_DollarName '$flock')
            )
          }
        )
      ]
    )
    (command.AndOr
      ops: [Op_DPipe]
      children: [
        (command.SimpleCommand
          words: [{(echo)} {($ VSub_Dollar '$$')}]
          redirects: [
            (redir.Redir
              op: <Redir_Great '>'>
              fd: 16777215
              arg_word: {($ VSub_DollarName '$flock')}
            )
          ]
        )
        (C {(die)} {(DQ ('ERROR: unable to write ') ($ VSub_DollarName '$flock') (.))})
      ]
    )
    (command.Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (lhs_expr.LhsName name:wroteflock spids:[2138])
          op: Equal
          rhs: {(1)}
          spids: [2138]
        )
      ]
      spids: [2138]
    )
    (command.SimpleCommand
      words: [{(echo)} {(nop)}]
      redirects: [(redir.Redir op:<Redir_Great '>'> fd:16777215 arg_word:{(current_tracer)})]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [
                    (command.SimpleCommand
                      words: [{(echo)} {(DQ ($ VSub_DollarName '$uprobe'))}]
                      redirects: [
                        (redir.Redir
                          op: <Redir_DGreat '>>'>
                          fd: 16777215
                          arg_word: {(uprobe_events)}
                        )
                      ]
                    )
                  ]
                  negated: T
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.SimpleCommand
              words: [
                {(echo)}
                {
                  (DQ ('ERROR: adding uprobe ') 
                    (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) ($ VSub_DollarName '$uprobe') (word_part.EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) (.)
                  )
                }
              ]
              redirects: [(redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DParen
                          child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike dmesg>)
                          spids: [2187 2192]
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (command.SimpleCommand
                      words: [
                        {(echo)}
                        {
                          (DQ ('Last ') ($ VSub_DollarName '$dmesg') 
                            (' dmesg entries (might contain reason):')
                          )
                        }
                      ]
                      redirects: [(redir.Redir op:<Redir_GreatAnd '>&'> fd:16777215 arg_word:{(2)})]
                    )
                    (command.Pipeline
                      children: [
                        (C {(dmesg)})
                        (C {(tail)} {(-) ($ VSub_DollarName '$dmesg')})
                        (C {(sed)} {(SQ <'s/^/    /'>)})
                      ]
                      negated: F
                    )
                  ]
                  spids: [16777215 2195]
                )
              ]
              spids: [16777215 2228]
            )
            (C {(edie)} {(DQ (Exiting.))})
          ]
          spids: [16777215 2168]
        )
      ]
      spids: [16777215 2237]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_view>)
                  spids: [2241 2246]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [(C {(cat)} {(events/uprobes/) ($ VSub_DollarName '$uname') (/format)}) (C {(edie)} {(DQ )})]
          spids: [16777215 2249]
        )
      ]
      spids: [16777215 2264]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_filter>)
                  spids: [2268 2273]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.Pipeline
                          children: [
                            (command.SimpleCommand
                              words: [{(echo)} {(DQ ($ VSub_DollarName '$filter'))}]
                              redirects: [
                                (redir.Redir
                                  op: <Redir_Great '>'>
                                  fd: 16777215
                                  arg_word: {(events/uprobes/) ($ VSub_DollarName '$uname') (/filter)}
                                )
                              ]
                            )
                          ]
                          negated: T
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(edie)} {(DQ ('ERROR: setting filter or -p. Exiting.'))})]
                  spids: [16777215 2296]
                )
              ]
              spids: [16777215 2306]
            )
          ]
          spids: [16777215 2276]
        )
      ]
      spids: [16777215 2308]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_stack>)
                  spids: [2312 2317]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.Pipeline
                          children: [
                            (command.SimpleCommand
                              words: [{(echo)} {(1)}]
                              redirects: [
                                (redir.Redir
                                  op: <Redir_Great '>'>
                                  fd: 16777215
                                  arg_word: {(options/userstacktrace)}
                                )
                              ]
                            )
                          ]
                          negated: T
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(edie)} {(DQ ('ERROR: enabling stack traces (-s). Exiting'))})]
                  spids: [16777215 2336]
                )
              ]
              spids: [16777215 2346]
            )
          ]
          spids: [16777215 2320]
        )
      ]
      spids: [16777215 2348]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [
                    (command.SimpleCommand
                      words: [{(echo)} {(1)}]
                      redirects: [
                        (redir.Redir
                          op: <Redir_Great '>'>
                          fd: 16777215
                          arg_word: {(events/uprobes/) ($ VSub_DollarName '$uname') (/enable)}
                        )
                      ]
                    )
                  ]
                  negated: T
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (C {(edie)} {(DQ ('ERROR: enabling uprobe ') ($ VSub_DollarName '$uname') ('. Exiting.'))})
          ]
          spids: [16777215 2365]
        )
      ]
      spids: [16777215 2376]
    )
    (C {(warn)} {(DQ ('echo > trace'))})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DParen
                  child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_duration>)
                  spids: [2390 2395]
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (C {(sleep)} {($ VSub_DollarName '$duration')})
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DParen
                          child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_headers>)
                          spids: [2408 2413]
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(cat)} {(trace)})]
                  spids: [16777215 2416]
                )
              ]
              else_action: [(C {(grep)} {(-v)} {(SQ <'^#'>)} {(trace)})]
              spids: [2424 2438]
            )
          ]
          spids: [16777215 2398]
        )
      ]
      else_action: [
        (command.AndOr
          ops: [Op_DAmp]
          children: [
            (command.DParen
              child: (arith_expr.ArithVarRef token:<Lit_ArithVarLike opt_headers>)
              spids: [2447 2452]
            )
            (C {(cat)} {(trace)})
          ]
        )
        (C {(cat)} {(trace_pipe)})
      ]
      spids: [2440 2465]
    )
    (C {(end)})
  ]
)