通用可配置的源代码插桩组件
立即解锁
发布时间: 2025-08-20 02:23:03 阅读量: 2 订阅数: 12 

### 通用可配置的源代码插桩组件
#### 1. TAU 插桩器工作流程概述
TAU 插桩器目前可处理 C、C++ 和 Fortran 语言的源代码。其工作流程如下:
```mermaid
graph LR
A[应用或库源代码] --> B[C/C++ 解析器]
A --> C[F77/F90 解析器]
B --> D[C/C++ IL]
C --> E[Fortran IL]
D --> F[IL 分析器]
E --> F
F --> G[PDB]
G --> H[插桩器]
A --> H
I[过滤文件] --> H
H --> J[插桩后的应用或库源代码]
```
具体步骤为:
1. 源代码首先由相应编程语言的解析器前端处理,生成中间语言(IL)文件。
2. IL 文件由 IL 分析器转换为程序数据库(PDB)文件。
3. 插桩器读取 PDB 文件、应用或库源代码以及过滤文件,并根据过滤后的插桩请求生成修改后的插桩源代码。
4. 应用配置文件中指定的过滤规则,选择性地启用或禁用某些代码区域(如函数或循环)的插桩。
5. 逐行读取原始应用或库源代码,并根据过滤后剩余的插桩请求,添加对 TAU 测量库的调用。
不过,TAU 插桩器目前仅生成 TAU 测量代码。若要实现通用化,需支持使用任何测量库,并适用于其他语言,前提是有合适的解析器前端。
#### 2. 可配置插桩组件的要求
为了使插桩器能与 TAU 以外的性能分析或调试工具配合使用,需要将硬编码的 TAU 测量 API 调用替换为用户指定的任意代码片段。需要考虑以下几个重要问题:
- 定义用户自定义插桩所需的基本构造有哪些?
- 插桩时可用的哪些额外信息可能有用?
- 如何在用户的代码片段中引用这些信息?
#### 3. 用户自定义插桩的基本构造
以下是几种基本构造:
##### 3.1 进入例程(Entering a Routine)
在函数开始处插入额外插桩代码,可使用 entry 构造:
```plaintext
entry file="*" routine="#" code="printf(\"Entering\\n\");"
```
- 文件和例程名可使用通配符,使用 # 作为例程名的通配符,避免与 C/C++ 函数签名中的 * 冲突。
- 可省略 file 和 routine 部分,采用默认的“全捕获”规则。
- 代码片段采用标准 C 语法,支持转义字符,可插入多行代码。
- 插桩前会进行文本替换,如 @FILE@ 替换为输入文件名,@LINE@ 替换为插入代码的原始行号。
关键字替换列表如下:
| 关键字 | 替换内容 |
| ---- | ---- |
| 所有构造: | |
| @FILE@ | 文件名 |
| @LINE@ | 插入的源代码行号 |
| @COL@ | 插入的列号 |
| decl, init, entry, exit, abort 仅适用: | |
| @ROUTINE@ | 例程名 |
| @BEGIN_LINE@ | 例程体开始行号 |
| @BEGIN_COL@ | 例程体开始列号 |
| @END_LINE@ | 例程体结束行号 |
| @END_COL@ | 例程体结束列号 |
| decl, entry, exit, abort 仅适用于 C++: | |
| @RTTI@ | 动态例程名(类/成员函数模板) |
| init 仅适用于 C/C++: | |
| @ARGC@ | main() 的第一个参数名 |
| @AR
0
0
复制全文