0

我有一个非常简单的问题,我还没有找到答案。

比如说,我有一个共享库 X,由 100 个同时运行的应用程序 A0、A1、... A99 使用。我已经使用“X-Provider”作为提供程序名称来检测我的库和 LTTNG。我的用户如何区分 A10 和 A15 中发生的 X-Provider 事件?

4

1 回答 1

1

使用lttng命令行实用程序,将vpid要记录的上下文字段添加到您的事件记录中,例如:

$ lttng add-context -u -t vpid

这针对当前录制会话的所有用户空间通道;您当然可以选择特定的录制会话和/或频道(请参阅lttng-add-context(1))。

您需要在启动跟踪器 ( lttng start) 之前使用此命令。

您的所有事件记录都将有一个名为的上下文字段vpid,它是发出它们的进程的虚拟 ID。

现在,您需要找到一种将此类 VPID 与实例 ID(A10、A15 等)相关联的方法。您可以使用自己的特定于应用程序的策略来执行此操作,或者您可以在启动应用程序时简单地记录一个初始事件,该事件指示实例 ID/名称,例如:

tracepoint(x_provider, app_state, app_id);

然后,在读取结果跟踪时,您可以将x_provider:app_state事件记录信息与库发出的事件的记录相关联。例如,使用Babeltrace 2 Python 绑定

import bt2

vpid_app_ids = {}

for msg in bt2.TraceCollectionMessageIterator('/path/to/trace'):
    if type(msg) is not bt2._EventMessageConst:
        continue

    vpid = int(msg.event.common_context_field['vpid'])

    if msg.event.name == 'x_provider:app_state':
        app_id = int(msg.event.payload_field['app_id'])
        vpid_app_ids[vpid] = app_id
    else:
        app_id = vpid_app_ids[vpid]

        # Continue to process `msg.event` knowing the instance ID is
        # `app_id`...

我没有测试上面的例子,但你明白了要点。

于 2022-01-14T16:39:30.730 回答