使用VSInstr分析应用性能无数据,请求排查操作流程缺陷
排查VS插桩性能分析无数据的问题
我来帮你梳理下可能出问题的地方,结合你给出的操作步骤,几个关键点值得重点排查:
1. 程序启动与追踪顺序错误(最可能的核心原因)
你的操作是先运行程序,再启动追踪,但**VsPerfCLREnv设置的环境变量必须在程序启动前生效**,而且对于已经运行的程序,不能用VsPerfCmd /start:trace来启动追踪——这个命令是用来启动新进程并追踪的,对已运行进程无效。
正确的关联逻辑应该是:
- 先设置环境变量,再启动程序
- 针对已运行程序,用附加进程的方式关联追踪
2. 强名称签名的潜在影响
你重新签名插桩后的DLL时,要注意两个细节:
- 确保
sn -Ra使用的密钥文件和原DLL的密钥完全一致,否则可能导致程序加载失败,追踪无法收集数据 - 可以先临时关闭强名称验证来排查:执行
sn -Vr MyAssembly.dll,插桩后无需重新签名,直接测试是否能收集数据。如果这样能成功,说明签名环节确实干扰了插桩后的DLL运行
3. VsPerfCmd参数使用不当
如果是为了收集函数时长和调用次数(插桩模式),要区分两种场景:
- 启动新程序追踪:用
VsPerfCmd /start:trace /output:../Reports/Report.vsp /launch:你的程序.exe,而不是手动启动程序后再执行/start:trace - 附加到已运行程序:先找到程序的PID(任务管理器→详细信息→PID列),执行
VsPerfCmd /attach:<你的程序PID> /output:../Reports/Report.vsp
4. 权限不足的隐性问题
性能分析工具需要较高权限来收集进程数据,建议全程用管理员身份运行命令提示符和VS2017,普通权限可能导致无法写入数据到.vsp文件,最终生成空报告。
修正后的完整操作流程建议
- 备份原
MyAssembly.dll文件 - 执行
VSInstr MyAssembly.dll生成插桩后的DLL(暂时忽略强名称警告) - 执行
sn -Vr MyAssembly.dll临时关闭强名称验证(测试用,后续可重新签名) - 以管理员身份打开命令提示符,执行
VsPerfCLREnv /traceon - 启动你的程序,定位至待分析步骤前
- 找到程序PID,执行
VsPerfCmd /attach:<PID> /output:../Reports/Report.vsp - 点击按钮触发目标流程并等待完成
- 执行
VsPerfCmd /detach - 执行
VsPerfCmd /shutdown - 执行
VsPerfCLREnv /off - 用VS2017打开生成的
Report.vsp文件
这样调整后,应该能正常收集到函数运行时长和调用次数的数据了。
内容的提问来源于stack exchange,提问作者Milan Gulyas
相关产品推荐
相关产品推荐

