使用手动和自动编译插桩对CPU运行时占用率突增进行检测.ppt

使用手动和自动编译插桩对CPU运行时占用率突增进行检测.ppt

  1. 1、本文档共67页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使用手动和自动编译插桩对CPU运行时占用率突增进行检测 Adisak Pochanayon 首席软件工程师 Netherrealm工作室 adisak@ 涵盖的主题 本演讲是关于基于插桩的运行时间分析。 代码插桩的方法 《真人快打》(MK)的PET分析程序(占用率突增检测器) 分析程序 分析程序的常见类型 硬件跟踪 基于事件的硬件 基于事件的软件 采样 插桩 手动插桩 显式插桩 / 代码标记 Wrapper函数 Detours代码库和“蹦床”(Trampolines)功能 显式插桩 要求代码标记(修改源代码) StartMarker(INFO) / StopMarker(INFO) 作用域 - ScopedMarker(INFO) class CScopedMarker { CScopedMarker(ProfDesc info) { StartMarker(info); } ~CScopedMarker(ProfDesc info) { StopMarker(info); } }; #define ScopedMarker(INFO) CScopedMarker(INFO) \ ProfInfo##__LINE__ Wrapper函数 编译时间 #定义函数 (…) wrapper函数 附加说明 – 与实现编译器无关 缺点– 只有在你有源代码时起作用 链接时间更换 / Wrapping GCC选项:-Wl,--wrap,函数名 __wrap_函数名 () __real_函数名() Wrapper函数 调用函数 目标函数 Wrapper函数 调用函数 “WRAPPER” 函数 “REAL” 函数 1 4 2 3 Wrapper函数 使用GCC / SNC进行wrapping malloc() 的示例 添加链接器标志: -Wl,--wrap,malloc extern C void* __real_malloc(size_t); extern C void* __wrap_malloc(size_t Size) { // 调用原始malloc() 函数 return __real_malloc(Size); } Detours代码库和蹦床(Trampolines) 这是一个为插桩修改代码的方法 可以由分析程序在目标代码/二进制文件上进行 调用库函数插桩的运行时间 请参阅微软Detours代码库 MIPS示例代码(讲义) 这是另一种形式的手动插桩,但此方式不要求对目标函数进行源代码标记。 Detours代码库和蹦床(Trampolines) 调用函数 目标函数 Detours代码库 调用函数 DETOUR 函数 目标函数 跳转 1 2 3 蹦床(Trampolines)功能 调用函数 目标函数 目标 PROLOG语言 Trampoline 缓冲器 目标 PROLOG语言 拷贝 蹦床(Trampolines)功能 调动函数 目标函数 目标 PROLOG语言 跳转 Trampoline 缓冲器 目标 PROLOG语言 蹦床(Trampolines)功能 调用函数 目标函数 目标 PROLOG语言 跳转 目标 PROLOG语言 Trampoline 缓冲器 Detours代码库和蹦床(Trampolines) 调用函数 DETOUR 函数 目标函数 跳转 目标 PROLOG语言 跳转 1 2 3 4 5 6 Trampoline 缓冲器 Detours代码库和蹦床(Trampolines) 小结(缺点) 必须自行编写:基于精简指令集RISC很琐碎 / 基于复杂指令集CISC更加困难 处理页面保护/ NX (不执行) 商业使用需要付费 微软Detours软件 /en-us/projects/detours/ 微软1999年关于Detours代码库和蹦床功能 (Trampolines)的研究论文: /pubs/68568/huntusenixnt99.pdf 手动插桩 手动插桩方法总结 显示标记 Wrapper函数 Detours代码库和蹦床功能(Trampolines) 所有方法都要求对函数进行识别和用户干预(代码标志、库函数调用或者链接器参数)。 自动插桩 你可能已经在使用自动插桩 有许多分析器支持自动插桩 Metrowerks CATS、VTune Call Graph、Visual Studio Profiler Visual C++ /callcap以及fastcap、GNU gprof (w/ gcc –pg) 辅助编译器插桩(CAI) 允许用户执行分析程序而编译器会为你进行标记 GCC: -finstrument-functions / SNC: -Xhooktrace Visual C++: _pente

文档评论(0)

zxj4123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档