#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