拓冰建站拓冰建站
首页 / 资讯中心 / 正文

如何用 TRACY_PLATFORM_HEADER 和自定义平台头把 Tracy 移植到不受支持的平台?

如何用 TRACY_PLATFORM_HEADER 和自定义平台头把 Tracy 移植到不受支持的平台【免费下载链接】tracyFrame profiler项目地址: https://gitcode.com/GitHub_Trending/tr/tracy你的程序要跑在一个 Tracy 没有原生支持的目标上官方手册中确认可用的平台只有 Windows、Linux、Android、FreeBSD、WSL、OSX、iOS、QNX主机/游戏机平台不在其列直接编译 Tracy 客户端时部分平台相关的代码路径要么编译不过要么行为不对。按手册的说法此时不应去改 Tracy 源码里的#if平台分支而是把 Tracy 指向一个你自己提供的平台头文件用TRACY_PLATFORM_HEADER机制替换掉它依赖的几个底层原语。完成移植后你的程序可以像其他平台一样把 trace 数据发给 Tracy Profiler。这个机制能替换什么、不能替换什么TRACY_PLATFORM_HEADER指向的头文件只用于TRACY_HAS_CUSTOM_*这一组钩子。手册明确列出当前暴露出来的可插拔类别只有四类钩子宏对应函数说明TRACY_HAS_CUSTOM_THREAD_IDtracy::PlatformGetThreadId()手册标注为Required必需TRACY_HAS_CUSTOM_USER_INFOtracy::PlatformGetHostname()、tracy::PlatformGetUserLogin()、tracy::PlatformGetUserFullName()标识 trace 头里的机器与用户TRACY_HAS_CUSTOM_SAFE_COPYtracy::PlatformSafeMemcpy()采样时快照可能未映射的内存TRACY_HAS_CUSTOM_ALLOCATORtracy::PlatformMalloc()/PlatformFree()/PlatformRealloc()/PlatformAllocatorInit()/PlatformAllocatorThreadInit()/PlatformAllocatorFinalize()/PlatformAllocatorThreadFinalize()替换 Tracy 内部分配器其余平台相关子系统——调用栈采集、上下文切换捕获、崩溃处理、系统追踪等——不能通过平台头插桩。如果你的平台不支持它们要在构建系统层面用对应的TRACY_NO_*宏关闭例如TRACY_NO_CALLSTACK、TRACY_NO_SAMPLING、TRACY_NO_CONTEXT_SWITCH、TRACY_NO_SYSTEM_TRACING、TRACY_NO_CRASH_HANDLER。第一步复制模板文件到工程里仓库提供了成对的模板文件examples/CustomPlatform/CustomPlatform.h — 平台头模板examples/CustomPlatform/CustomPlatform.cpp — 各钩子函数的模板实现把这两个文件复制进你的工程重命名为你自己的平台头手册示例里叫my_platform.h然后只填你启用的那些钩子的函数体。模板里每个函数都带契约注释几个关键约束PlatformGetThreadId()返回的是内核线程 ID。注释特别警告pthread_self()不可用——它返回的是库句柄而不是内核 ID。用户信息三个函数如果平台没有对应概念返回占位字符串如(?)即可。PlatformSafeMemcpy()必须对不可读的输入不崩溃而是返回false直接memcpy()不是合法实现。分配器Malloc/Free/Realloc必须线程安全ThreadInit只是可选的预热prime不是前置条件Finalize还必须拆掉调用线程自己的 per-thread 状态——Tracy 不会在调用Finalize前为那个正在退出的线程调用ThreadFinalize。模板 CustomPlatform.cpp 给出了一份可以直接链接的桩实现线程 ID 返回 0、主机名/用户名返回(?)、PlatformSafeMemcpy直接返回false让 Tracy 跳过快照真实实现可用 Win32 的 SEH、POSIX 的pipe(2)或等价的探测复制原语、分配器转发到 C 运行时的malloc/free/realloc。你的工作就是把需要的桩换成目标平台上的真实实现。第二步在头里启用钩子并把实现链接进最终二进制平台头里把你需要的钩子对应的TRACY_HAS_CUSTOM_*宏定义打开模板里默认都注释掉了并声明对应的tracy::Platform*函数。函数实现必须放在一个单独的文件里该文件链接进你的最终二进制。头文件模板里的注释还强调了一条纪律只放TRACY_HAS_CUSTOM_*钩子和匹配的函数声明不要在这个头里设置TRACY_ENABLE、TRACY_ON_DEMAND这类无关的TRACY_*选项——其中一些选项在Tracy.hpp包含平台头之前就会被检查放这里会导致不同编译单元看到不一致的结果。这些开关一律在构建系统层面设置。第三步构建时指定 TRACY_PLATFORM_HEADER把 Tracy 指向你的平台头构建参数是-DTRACY_PLATFORM_HEADER\my_platform.h\注意值里内嵌的引号是宏展开后再#include所需要的原样保留。用 CMake 集成时TRACY_PLATFORM_HEADER是 Build options 表 中列出的选项之一与布尔开关不同它取的是值头文件路径而不是 ON/OFF启用 profiling 仍需显式设置TRACY_ENABLECMake 下默认 OFF。如果你不用 CMake则像手册 Initial client setup 一节描述的那样自己把这些宏定义加进全局编译标志。实现文件记得加进最终二进制的链接对象里否则运行时会缺符号。验证宏一致性与功能检测结果手册给出两条可以实际操作的核对手段链接期的宏失配检测。Tracy 会把关键构建选项编码进内部函数名各编译单元宏定义不一致时会直接产生链接错误例如MSVC 示例error LNK2019: unresolved external symbol int __cdecl GetProfiler_CFG_E1_OD1_DI0_ML0_F0_DHT0_TF0(void) ...对照 public/client/TracyMangle.hpp 中的缩写表和当前构建设置就能定位是哪个宏在哪个编译单元设错了。TRACING_VERBOSE功能检测输出。定义TRACING_VERBOSE对应 CMake 选项TRACY_VERBOSE后客户端会把检测到的功能详情打到标准错误输出把这些 debug 打印和源码对照可以判断目标平台上哪些功能缺失、为什么缺失。客户端自身的诊断信息默认也会作为 Message log 发到服务端。需要留意的一个手册点名的盲区如果某处漏了TRACY_ENABLE而库是带它构建的链接会成功但 Tracy 仍会启动并尝试连接 Profiler——这类失配链接期检测不到属于多模块工程里需要靠构建纪律保证的事项。限制TRACY_HAS_CUSTOM_*四组钩子是当前机制暴露的全部可插拔面手册原文说明其他子系统cannot be plugged this way只能用TRACY_NO_*关闭不能试图用平台头去桩掉它们。平台头不是通用配置头往里面塞TRACY_ENABLE、TRACY_ON_DEMAND之类的选项会产生依赖编译单元的未定义行为这类开关必须走构建系统。移植完成后目标平台能否完整出数据仍受 Tracy 通用限制约束仅小端 CPU、48 位虚拟地址空间等见手册 Limitations 一节这些限制与平台头机制本身无关但目标架构不满足时移植没有意义。【免费下载链接】tracyFrame profiler项目地址: https://gitcode.com/GitHub_Trending/tr/tracy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门