0

使用:Linux/lttng/babeltrace 2 上的 .NET Core 6

我使用 lttng 来收集有关在我的程序运行时调用的函数的信息。我想了解调用了哪个线程函数。

我运行这个脚本

export COMPlus_PerfMapEnabled=1
export COMPlus_EnableEventLog=1
 
lttng create my-session -o ./my-trace
lttng enable-channel --userspace DotNetCoreChannel
lttng enable-event --userspace --tracepoint DotNETRuntime:EventSource --channel=DotNetCoreChannel --filter "EventSourceName=='Trace'"
lttng start
dotnet run 
lttng stop
lttng view
lttng destroy my-session

并得到这样的痕迹

[22:05:00.402124499] (+?.?????????) userVM DotNETRuntime:EventSource: { cpu_id = 1 }, { EventID = 1, EventName = "Enter", EventSourceName = "Trace", Payload = "" }
[22:05:00.429636742] (+0.000147700) userVM DotNETRuntime:EventSource: { cpu_id = 1 }, { EventID = 2, EventName = "Leave", EventSourceName = "Trace", Payload = "" }

首先我认为 cpu_id 表示线程号,但是当我在更大的程序上运行时,我得到了跟踪,其中 Enter 和 Leave 具有不同的 cpu_id,这就是为什么我正在寻找在跟踪中获取 threadIds 的方法

4

1 回答 1

1

从 LTTing 文档中将要记录的上下文字段添加到通道的事件记录中

跟踪文件中的事件记录字段提供有关先前发出的事件的重要信息,但有时某些外部上下文可能会帮助您更快地解决问题。

上下文字段的示例是:

  • LTTng 发出事件的线程的进程 ID、线程 ID、进程名称和进程优先级。

然后跟进:

示例:将要记录的上下文字段添加到特定通道的事件记录中。以下命令行将线程标识符和用户调用堆栈上下文字段添加到当前录制会话的名为 my-channel 的 Linux 内核通道。

lttng add-context --kernel --channel=my-channel \
                  --type=tid --type=callstack-user

因此,如果您添加--type=tid到频道,您应该获得线程 ID。(编辑以包括评论信息):

lttng enable-channel --userspace DotNetCoreChannel
lttng add-context --userspace --channel=DotNetCoreChannel --type=vtid
于 2021-12-07T14:00:29.640 回答