forked from iovisor/bcc
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
argdist, trace, and tplist support for USDT probes
These tools now support USDT probes with the 'u:provider:probe' syntax. Probes in a library or process can be listed with 'tplist -l LIB' or 'tplist -p PID'. Probe arguments are also parsed and available in both argdist and trace as arg1, arg2, etc., regardless of the probe attach location. The same USDT probe can be used at multiple locations, which means the attach infra- structure must probe all these locations. argdist and trace register thunk probes at each location, which call a central probe function (which is static inline) with the location id (__loc_id). The central probe function checks the location id to determine how the arguments should be retrieved -- this is location-dependent. Finally, some USDT probes must be enabled first by writing a value to a memory location (this is called a "semaphore"). This value is per-process, so we require a process id for this kind of probes. Along with trace and argdist tool support, this commit also introduces new classes in the bcc module: ProcStat handles pid-wrap detection, whereas USDTReader, USDTProbe, USDTProbeLocation, and USDTArgument are the shared USDT-related infrastructure that enables enumeration, attachment, and argument retrieval for USDT probes.
- Loading branch information
Showing
14 changed files
with
924 additions
and
164 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
# Copyright 2016 Sasha Goldshtein | ||
# | ||
# Licensed under the Apache License, Version 2.0 (the "License"); | ||
# you may not use this file except in compliance with the License. | ||
# You may obtain a copy of the License at | ||
# | ||
# https://www.apache.org/licenses/LICENSE-2.0 | ||
# | ||
# Unless required by applicable law or agreed to in writing, software | ||
# distributed under the License is distributed on an "AS IS" BASIS, | ||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
# See the License for the specific language governing permissions and | ||
# limitations under the License. | ||
|
||
import os | ||
|
||
class ProcStat(object): | ||
def __init__(self, pid): | ||
self.pid = pid | ||
self.exe = self._get_exe() | ||
self.start_time = self._get_start_time() | ||
|
||
def is_stale(self): | ||
return self.exe != self._get_exe() or \ | ||
self.start_time != self._get_start_time() | ||
|
||
def _get_exe(self): | ||
return os.popen("readlink -f /proc/%d/exe" % self.pid).read() | ||
|
||
def _get_start_time(self): | ||
return os.popen("cut -d' ' -f 22 /proc/%d/stat" % | ||
self.pid).read() | ||
|
Oops, something went wrong.