1. 03 Feb, 2017 2 commits
    • Kenny Yu's avatar
      Address comments from https://github.com/iovisor/bcc/pull/936 · e7dff43a
      Kenny Yu authored
      - Remove dependency on networkx. I did this by copying only the parts I needed
        from networkx, and adapting it to only use what I needed. These include:
        `DiGraph`, `strongly_connected_components`, `simple_cyles`
      
      - Symbolize global and static mutexes. In order to do this, I subshell out to
        `subshell`. This isn't very efficient, but this only happens at the end of
        the program if a deadlock is found, so it's not too bad.
      
      - `--verbose` mode to print graph statistics
      
      - Make `--binary` flag optional. Not needed by default, However, this is needed
        on kernels without this recent kernel patch
        (https://lkml.org/lkml/2017/1/13/585, submitted 2 weeks ago): we can't attach
        a uprobe on a binary that has `:` in the path name. Instead, we can create a
        symlink without `:` in the path and pass that to the `--binary` argument
        instead.
      e7dff43a
    • Kenny Yu's avatar
      tools: add tool to detect potential deadlocks in running programs · 66fb4d29
      Kenny Yu authored
      `deadlock_detector` is a new tool to detect potential deadlocks (lock order
      inversions) in a running process. The program attaches uprobes on
      `pthread_mutex_lock` and `pthread_mutex_unlock` to build a mutex wait directed
      graph, and then looks for a cycle in this graph. This graph has the following
      properties:
      
      - Nodes in the graph represent mutexes.
      - Edge (A, B) exists if there exists some thread T where lock(A) was called
        and lock(B) was called before unlock(A) was called.
      
      If there is a cycle in this graph, this indicates that there is a lock order
      inversion (potential deadlock). If the program finds a lock order inversion, the
      program will dump the cycle of mutexes, dump the stack traces where each mutex
      was acquired, and then exit.
      
      The format of the output uses a similar output as ThreadSanitizer (See example:
      https://github.com/google/sanitizers/wiki/ThreadSanitizerDeadlockDetector)
      
      This program can only find potential deadlocks that occur while the program is
      tracing the process. It cannot find deadlocks that may have occurred before the
      program was attached to the process.
      
      If the traced process has many mutexes and threads, this program will add a
      very large overhead because every mutex lock/unlock and clone call will be
      traced. This tool is meant for debugging only, and you should run this tool
      only on programs where the slowdown is acceptable.
      
      Note: This tool adds a dependency on `networkx` for the graph libraries
      (building a directed graph and cycle detection).
      
      Note: This tool does not work for shared mutexes or recursive mutexes.
      
      For shared (read-write) mutexes, a deadlock requires a cycle in the wait
      graph where at least one of the mutexes in the cycle is acquiring exclusive
      (write) ownership.
      
      For recursive mutexes, lock() is called multiple times on the same mutex.
      However, there is no way to determine if a mutex is a recursive mutex
      after the mutex has been created. As a result, this tool will not find
      potential deadlocks that involve only one mutex.
      66fb4d29
  2. 01 Feb, 2017 7 commits
    • 4ast's avatar
      Merge pull request #928 from goldshtn/tp-data-loc · 4a57f4dd
      4ast authored
      Support for __data_loc tracepoint fields
      4a57f4dd
    • Sasha Goldshtein's avatar
      tplist: Don't ignore __data_loc fields · 3ea6eee8
      Sasha Goldshtein authored
      3ea6eee8
    • Sasha Goldshtein's avatar
      c6aaaed1
    • Sasha Goldshtein's avatar
      cc: Support for __data_loc tracepoint fields · b9545a5c
      Sasha Goldshtein authored
      `__data_loc` fields are dynamically sized by the kernel at
      runtime. The field data follows the tracepoint structure entry,
      and needs to be extracted in a special way. The `__data_loc` field
      itself is a 32-bit value that consists of two 16-bit parts: the
      high 16 bits are the length of the data, and the low 16 bits are
      the offset of the data from the beginning of the tracepoint
      structure. From a cursory look, there are >200 tracepoints in
      recent kernels that have this kind of field.
      
      This patch fixes `tp_frontend_action.cc` to recognize and emit
      `__data_loc` fields correctly, as 32-bit opaque fields. Then, it
      introduces two helper macros:
      
      `TP_DATA_LOC_READ(dst, field)` reads from `args->field` by finding
      the right offset and length and emitting the `bpf_probe_read`
      required to fetch the data. This will only work with new kernels.
      
      `TP_DATA_LOC_READ_CONST(dst, field, length)` takes a user-specified
      length rather than finding it from `args->field`. This will work
      on older kernels, where the BPF verifier doesn't allow non-constant
      sizes to be passed to `bpf_probe_read`.
      b9545a5c
    • 4ast's avatar
      Merge pull request #918 from derek0883/mybcc · b77915df
      4ast authored
      Handling multiple concurrent probe users.
      b77915df
    • Derek's avatar
      enum bpf_probe_attach_type to CAPITAL · 227b5b99
      Derek authored
      227b5b99
    • Derek's avatar
      undo rebase · a112514c
      Derek authored
      a112514c
  3. 31 Jan, 2017 10 commits
  4. 30 Jan, 2017 4 commits
  5. 29 Jan, 2017 2 commits
  6. 26 Jan, 2017 1 commit
  7. 24 Jan, 2017 2 commits
  8. 23 Jan, 2017 1 commit
    • Derek's avatar
      Handling multiple concurrent probe users. · 739581f8
      Derek authored
      Event naming pattern changed to $(eventname)_bcc_$(pid)
      Detect /sys/kernel/debug/tracing/instances in bpf_attach_probe,
      if it exist, then will per-instance event, if failed the make global
      event instance as same as before.
      739581f8
  9. 22 Jan, 2017 1 commit
  10. 21 Jan, 2017 2 commits
  11. 20 Jan, 2017 3 commits
  12. 17 Jan, 2017 5 commits
    • 4ast's avatar
      Merge pull request #911 from goldshtn/trace-params-signature · 3cc4c0a2
      4ast authored
      trace: Allow function signatures in uprobes and kprobes
      3cc4c0a2
    • 4ast's avatar
      Merge pull request #909 from goldshtn/tp-str-fixes · e30eaecd
      4ast authored
      trace, tplist, argdist: UDST probe miscellaneous fixes
      e30eaecd
    • Sasha Goldshtein's avatar
      trace: Allow function signatures in uprobes and kprobes · 23e72b89
      Sasha Goldshtein authored
      §`trace` now allows uprobes and kprobes to have function signatures,
      which means function parameters can be named and typed, rather than
      relying on the positional arg1, arg2, etc. arguments. This also
      enables structure field access, which is impossible with the unnamed
      arguments due to rewriter limitations.
      
      The example requested by @brendangregg, which now works, is the
      following:
      
      §Â```
      PID    TID    COMM         FUNC             -
      777    785    automount    SyS_nanosleep    sleep for 500000000 ns
      777    785    automount    SyS_nanosleep    sleep for 500000000 ns
      777    785    automount    SyS_nanosleep    sleep for 500000000 ns
      777    785    automount    SyS_nanosleep    sleep for 500000000 ns
      ^C
      ```
      23e72b89
    • Sasha Goldshtein's avatar
      dcf1675a
    • Sasha Goldshtein's avatar
      trace: Use correct argument index and tgid for filters · b630092f
      Sasha Goldshtein authored
      `trace` would use the incorrect argument index for USDT probes when
      filtering specifically, e.g. `trace u:lib:tp (arg1 != 0) ...` would
      actually use the type of the 2nd argument, and not the 1st argument
      for the type of the filter variable in the generated program. This
      could cause compilation errors or subtle bugs where the data would
      be either extended or contracted to fit the wrong argument's type.
      
      Additionally, `trace` would use the pid (thread id, `-L`) filter
      with the `attach_uprobe` API, which expects a tgid (process id).
      As a result, incorrect filtering would happen.
      b630092f