From 7ced6a1ea1759cfb840b92d56545b2486eb6531e Mon Sep 17 00:00:00 2001 From: wenlong12 Date: Tue, 15 Mar 2022 19:09:34 +0800 Subject: [PATCH] translate I4XA5Q Signed-off-by: wenlong12 Signed-off-by: wenlong12 --- README.md | 145 ++++++++++++++++++ README_zh.md | 2 +- figures/architecture.png | Bin 0 -> 12648 bytes ...2314(WeLinkPC).png => architecture_zh.png} | Bin 4 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 README.md create mode 100644 figures/architecture.png rename figures/{20210422-202314(WeLinkPC).png => architecture_zh.png} (100%) mode change 100755 => 100644 diff --git a/README.md b/README.md new file mode 100644 index 0000000..03b4588 --- /dev/null +++ b/README.md @@ -0,0 +1,145 @@ +# ByTrace + +- [Introduction](#section152771918494) +- [Architecture](#section6808195518497) +- [Directory Structure](#section1610792125019) +- [Usage](#section18684185975017) +- [Repositories Involved](#section1849151125618) + +## Introduction + +ByTrace is a tool for you to trace processes and monitor performance. It encapsulates and extends the ftrace in the kernel and supports tracing in the user space. This tool provides APIs and commands: + +1. APIs: When developing an application, you can call ByTrace APIs in the application key code to perform tracing. +2. Commands: You can enable the desired label to obtain the tracing information. With ByTrace, you can enable a user-space or kernel-space label you want to view (run the **bytrace -l** command to query all the supported labels) and run the corresponding commands to capture traces and dump them to a specified file. + +## Architecture + +![](figures/architecture.png) + +## Directory Structure + +``` +/developtools/bytrace_standard +├── bin # ByTrace code +│ └── include # Header files +│ └── src # Source files +│ └── test # Test cases +├── interfaces # APIs +│ └── innerkits # Header files of internal subsystems +│ └── kits # Header files exposed externally +├── script # Scripts +``` + +## Usage + +The following table lists the commands supported by ByTrace. + +** Table 1** Commands supported by ByTrace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Option

+

Description

+

-h, --help

+

Views the help Information.

+

-b n, --buffer_size n

+

Sets the size of the buffer (KB) for storing and reading traces. The default buffer size is 2048 KB.

+

-t n, --time n

+

Sets the ByTrace uptime in seconds, which depends on the time required for analysis.

+

--trace_clock clock

+

Sets the type of the clock for adding a timestamp to a trace, which can be boot (default), global, mono, uptime, or perf.

+

--trace_begin

+

Starts trace.

+

--trace_dump

+

Dumps traced data to a specified position (the default position is the console).

+

--trace_finish

+

Stops capturing traces and dumps traced data to a specified position (the default position is the console).

+

-l, --list_categories

+

Lists the ByTrace categories supported by the device.

+

--overwrite

+

Sets the action to take when the buffer is full. If this option is used, the latest traced data is discarded.

+

-o filename, --output filename

+

Outputs traced data to a specified file.

+

-z

+

Compresses traced data.

+
+ +The following are some example ByTrace commands: + +- Run the following command to query supported labels: + + ``` + bytrace -l + ``` + + or + + ``` + bytrace --list_categories + ``` + + +- Run the following command to capture traces whose label is ability, with the buffer size set to 4096 KB and ByTrace uptime set to 10s: + + ``` + bytrace -b 4096 -t 10 --overwrite ability > /data/mytrace.ftrace + ``` + + +- Run the following command to set the clock type for traces to mono: + + ``` + bytrace --trace_clock mono -b 4096 -t 10 --overwrite ability > /data/mytrace.ftrace + ``` + + +- Run the following command to compress the traced data: + + ``` + bytrace -z -b 4096 -t 10 --overwrite ability > /data/mytrace.ftrace + ``` + + +## Repositories Involved + +Development Tools Subsystem + +**developtools\_bytrace\_standard** diff --git a/README_zh.md b/README_zh.md index 67a8773..f90da15 100755 --- a/README_zh.md +++ b/README_zh.md @@ -15,7 +15,7 @@ bytrace是开发人员用于追踪进程轨迹、查看性能的一种工具, ## 架构图 -![](figures/20210422-202314(WeLinkPC).png) +![](figures/architecture_zh.png) ## 目录 diff --git a/figures/architecture.png b/figures/architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d09f8e2acd19b0d6003b1e16a462c253db2989 GIT binary patch literal 12648 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