运行测试
在Linux用LTTNG运行[LTTng学习之旅]——在用户程序中简单的添加一个trace点_应用内加trace点-CSDN博客
模板代码遇到报错:
error: expected ‘)’ before ‘(’ token
25 | LTTNG_UST_TP_ARGS(
| ^
| )
版本:lttng (LTTng Trace Control) 2.11.2 这个问题由于版本引起的,不同版本接口有点不一样(主要是新的版本宏添加了_UST_
, tracelogging的库中已经解决了这个问题,会去判断LTTng的版本)。这个版本的示例文档 v2.11— LTTng
gcc -c -I. tp.c
gcc -c app.c
gcc -o app tp.o app.o -llttng-ust -ldl
lttng create my-session
# lttng enable-event --userspace 'my_provider:*'
lttng enable-event --userspace my_provider:simple_event
lttng enable-event --userspace my_provider:event_instance2
lttng start
./app 2 hello word
lttng stop
lttng view
lttng destroy
输出:
Trace directory: /home/lttng-traces/my-session-20250108-150438
[15:05:51.610552470] (+?.?????????) PowerEdge-R750 my_provider:simple_event: { cpu_id = 64 }, { argc = "./app", argv = 3 }
[15:05:51.610574909] (+0.000022439) PowerEdge-R750 my_provider:event_instance2: { cpu_id = 64 }, { a = 17, b = 15, c = "[other string]" }
- 内核态的使用LTTng v2.13 — LTTng 文档 — LTTng
- 用户的追踪LTTng v2.13 — LTTng 文档 — LTTng
- 原理的解释,这个LTTNG是怎么工作的lttng学习笔记 | 我的博客 以及比最差的API(ETW)更差的API(LTTng)是如何炼成的, 谈如何写一个好的接口 - q303248153 - 博客园
编译运行TraceLogging for LTTng:
mkdir build
cd build
cmake ..
make
sudo make install
make test
./LTTngTest
测试过程:
lttng create
lttng enable-event -u TestProviderC:*
lttng enable-event -u TestProviderCpp:*
lttng start
./test/LTTngTest
lttng stop
lttng view
部分结果:
Trace directory: /home/lttng-traces/auto-20250108-173818
[17:39:53.166062858] (+?.?????????) xmu-PowerEdge-R750 TestProviderC:Event1;k;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ] }
[17:39:53.166065190] (+0.000002332) xmu-PowerEdge-R750 TestProviderC:Event2;k0;k1;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ] }
[17:39:53.166065870] (+0.000000680) xmu-PowerEdge-R750 TestProviderC:CScalars1;k;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ] }
[17:39:53.166066160] (+0.000000290) xmu-PowerEdge-R750 TestProviderC:CScalars2;k0;k2;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ], _ms_Opcode = 0x2 }
[17:39:53.166066604] (+0.000000444) xmu-PowerEdge-R750 TestProviderC:CScalars3;k0;k2;k7;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ], _ms_Opcode = 0x3, _ms_Channel = 11, _ms_EventTag = 0x1234, 1 = 1 }
[17:39:53.166070367] (+0.000003763) xmu-PowerEdge-R750 TestProviderC:ThreadActivity0;k;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ] }
[17:39:53.166070719] (+0.000000352) xmu-PowerEdge-R750 TestProviderC:ThreadActivity1;k;: { cpu_id = 22 }, { __ms_ActivityId_length = 16, _ms_ActivityId = [ [0] = 0x1, [1] = 0x2, [2] = 0x3, [3] = 0x4, [4] = 0x5, [5] = 0x6, [6] = 0x7, [7] = 0x8, [8] = 0x1, [9] = 0x2, [10] = 0x3, [11] = 0x4, [12] = 0x5, [13] = 0x6, [14] = 0x7, [15] = 0x8 ] }
[17:39:53.166071219] (+0.000000500) xmu-PowerEdge-R750 TestProviderC:ThreadActivity2;k;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ] }
[17:39:53.166071550] (+0.000000331) xmu-PowerEdge-R750 TestProviderC:Transfer00;k;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ], __ms_RelatedActivityId_length = 0, _ms_RelatedActivityId = [ ] }
[17:39:53.166071887] (+0.000000337) xmu-PowerEdge-R750
[17:39:53.166073283] (+0.000000353) xmu-PowerEdge-R750 TestProviderC:TransferOO;k;: { cpu_id = 22 }, { __ms_ActivityId_length = 16, _ms_ActivityId = [ [0] = 0x0, [1] = 0x0, [2] = 0x0, [3] = 0x0, [4] = 0x0, [5] = 0x0, [6] = 0x0, [7] = 0x0, [8] = 0x0, [9] = 0x0, [10] = 0x0, [11] = 0x0, [12] = 0x0, [13] = 0x0, [14] = 0x0, [15] = 0x0 ], __ms_RelatedActivityId_length = 16, _ms_RelatedActivityId = [ [0] = 0x0, [1] = 0x0, [2] = 0x0, [3] = 0x0, [4] = 0x0, [5] = 0x0, [6] = 0x0, [7] = 0x0, [8] = 0x0, [9] = 0x0, [10] = 0x0, [11] = 0x0, [12] = 0x0, [13] = 0x0, [14] = 0x0, [15] = 0x0 ] }
[17:39:53.166073585] (+0.000000302) xmu-PowerEdge-R750 TestProviderC:i8;k;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ], i8 = 100 }
[17:39:53.166073875] (+0.000000290) xmu-PowerEdge-R750 TestProviderC:u8;k;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ], u8 = 200 }
[17:39:53.166074593] (+0.000000718) xmu-PowerEdge-R750 TestProviderC:i16;k;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ], i16 = 30000 }
[17:39:53.166074923] (+0.000000330) xmu-PowerEdge-R750 TestProviderC:u16;k;: { cpu_id = 22 }, { __ms_ActivityId_length = 0, _ms_ActivityId = [ ], u16 = 60000 }
使用方法
// 简单一点的例子
LTTNG_UST_TRACEPOINT_EVENT( // 这个宏用于定义了一个跟踪点事件
hello_world, // 事件的提供者名
my_first_tracepoint, // 跟踪事件的名称
LTTNG_UST_TP_ARGS( // 定义了跟踪点的参数,这里有两个参数
int, my_integer_arg,
char *, my_string_arg
),
LTTNG_UST_TP_FIELDS( // 实际要在事件中跟踪写log的数据字段
lttng_ust_field_string(my_string_field, my_string_arg),
lttng_ust_field_integer(int, my_integer_field, my_integer_arg)
)
)
// 使用
#include <stdio.h>
#include "hello-tp.h"
int main(int argc, char *argv[])
{
unsigned int i;
puts("Hello, World!\nPress Enter to continue...");
getchar();
/*
* An lttng_ust_tracepoint() call.
*
* Arguments, as defined in `hello-tp.h`:
*
* 1. Tracepoint provider name (required)
* 2. Tracepoint name (required)
* 3. `my_integer_arg` (first user-defined argument)
* 4. `my_string_arg` (second user-defined argument)
*
* Notice the tracepoint provider and tracepoint names are
* C identifiers, NOT strings: they're in fact parts of variables
* that the macros in `hello-tp.h` create.
*/
lttng_ust_tracepoint(hello_world, my_first_tracepoint, 23,
"hi there!");
for (i = 0; i < argc; i++) {
lttng_ust_tracepoint(hello_world, my_first_tracepoint,
i, argv[i]);
}
puts("Quitting now!");
lttng_ust_tracepoint(hello_world, my_first_tracepoint,
i * i, "i^2");
return 0;
}
框架组成
- 创建并编译了两个库
lttngh
(核心库)和tracelogging
(接口库)。 LTTng::UST
:该库是LTTng
用户空间跟踪库的接口目标,它是lttngh
库的公开依赖。lttng-ust-tracepoint::lttng-ust-tracepoint
:该库是lttng-ust-tracepoint
的别名目标,它是lttngh
库的私有依赖。