Как получить идентификатор потока во время отслеживания источников событий с помощью lttng

#c# #.net #lttng #babeltrace

#c# #.net #lttng #babeltrace

Вопрос:

ИСПОЛЬЗОВАНИЕ: .NET Core 6 в linux / lttng / babeltrace 2

Я использую 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, поэтому я ищу способ получить идентификаторы потоков в трассировке

Ответ №1:

Из документации LTTing добавьте контекстные поля, которые будут записаны в записи событий канала:

Поля записи событий в файлах трассировки предоставляют важную информацию о ранее отправленных событиях, но иногда некоторый внешний контекст может помочь вам быстрее решить проблему.

Примерами контекстных полей являются:

  • Идентификатор процесса, идентификатор потока, имя процесса и приоритет процесса потока, из которого LTTng отправляет событие.

И затем следует:

Пример: добавьте контекстные поля, которые будут записаны в записи событий определенного канала. Следующая командная строка добавляет идентификатор потока и поля контекста стека пользовательских вызовов в канал ядра Linux с именем my-channel текущего сеанса записи.

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

Итак, похоже, что если вы добавляете --type=tid в канал, вы должны получить идентификатор потока. (отредактируйте, чтобы включить информацию о комментариях):

 lttng enable-channel --userspace DotNetCoreChannel
lttng add-context --userspace --channel=DotNetCoreChannel --type=vtid
 

Комментарии:

1. Для отслеживания пользовательского пространства вам нужен vtid контекст . Команда add-context должна быть: lttng add-context --userspace --channel=DotNetCoreChannel --type=vtid